IOSurfaceLock何时需要IOSurface操作?

时间:2014-05-02 14:40:15

标签: ios objective-c

要使用快速屏幕截图,我需要执行一些IOSurfaceRef操作 - 使用CARenderServerRenderDisplay(0, CFSTR("LCD"), iosurfaceref, 0, 0)捕获图像,然后将iosurfaceref转换为CGImage。 我的问题是,我需要何时何地将IOSurfaceLock(surface, 0, nil)IOSurfaceUnlock(surface, 0, 0)放在这些IOSurface操作周围? 下面的示例代码(来自https://github.com/k06a/UIView-FastScreenshot/blob/master/UIView%2BFastScreenshot.m)执行主线程中的所有操作,但仍然适用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);

1 个答案:

答案 0 :(得分:1)

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

即使只能从主线程访问曲面,其他进程也可能会尝试同时使用曲面。

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