菜鸟教程小白 发表于 2022-12-12 22:10:27

ios - IOSurface 操作何时需要 IOSurfaceLock?


                                            <p><p>要使用快速截屏,我需要做一些 IOSurfaceRef 操作——用 <code>CARenderServerRenderDisplay(0, CFSTR("LCD"), iosurfaceref, 0, 0)</code> 捕获图像,然后转换iosurfaceref 到 CGImage。
我的问题是,我需要在何时何地在这些 IOSurface 操作周围放置 <code>IOSurfaceLock(surface, 0, nil)</code> 和 <code>IOSurfaceUnlock(surface, 0, 0)</code> ?
本示例代码(来自 <a href="https://github.com/k06a/UIView-FastScreenshot/blob/master/UIView%2BFastScreenshot.m" rel="noreferrer noopener nofollow">https://github.com/k06a/UIView-FastScreenshot/blob/master/UIView%2BFastScreenshot.m</a> ) 下面在主线程中做所有事情,但仍然应用 IOSurfaceLock,为什么?</p>

<pre><code>IOSurfaceLock(surface, 0, nil);
CARenderServerRenderDisplay(0, CFSTR(&#34;LCD&#34;), surface, 0, 0);
void * baseAddr = IOSurfaceGetBaseAddress(surface);
NSData * data = ;
IOSurfaceUnlock(surface, 0, 0);
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>一个 IOSurface 可以在多个进程之间共享。在 OS X 上,您可以使用 <code>IOSurfaceCreateMachPort</code> 或 <code>IOSurfaceCreateXPCObject</code> 将表面引用包装在可以跨进程边界发送的对象中。</p>

<p>即使<strong>您</strong>只从主线程访问表面,其他进程也可能同时尝试使用表面。</p>

<p>如果您从表面复制数据,而另一个进程正在修改表面中的数据,您将无法获得表面内容的一致 View ,反之亦然。为了避免这个问题,每个进程都应该在读写表面数据之前调用<code>IOSurfaceLock</code>,之后调用<code>IOSurfaceUnlock</code>。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - IOSurface 操作何时需要 IOSurfaceLock?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/23430809/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/23430809/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - IOSurface 操作何时需要 IOSurfaceLock?