gpt4 book ai didi

ios - IOSurface 操作什么时候需要 IOSurfaceLock?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:23:32 30 4
gpt4 key购买 nike

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

IOSurfaceLock(surface, 0, nil);
CARenderServerRenderDisplay(0, CFSTR("LCD"), surface, 0, 0);
void * baseAddr = IOSurfaceGetBaseAddress(surface);
NSData * data = [NSData dataWithBytes:baseAddr length:totalBytes];
IOSurfaceUnlock(surface, 0, 0);

最佳答案

IOSurface 可以在多个进程之间共享。在 OS X 上,您可以使用 IOSurfaceCreateMachPortIOSurfaceCreateXPCObject 将表面引用包装在可以跨进程边界发送的对象中。

即使仅从您的主线程访问表面,其他进程也可能同时尝试使用该表面。

如果您正在从表面复制数据,而另一个进程正在修改表面中的数据,您将无法获得表面内容的一致 View ,反之亦然。为了避免这个问题,每个进程应该在读取或写入表面数据之前调用IOSurfaceLock,然后调用IOSurfaceUnlock

关于ios - IOSurface 操作什么时候需要 IOSurfaceLock?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23430809/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com