我在修改macOS 10.13.6上的IOSurface时遇到问题。在我看来,锁定无法像所记录的那样起作用。这是我的代码:
NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:640], kIOSurfaceWidth,
[NSNumber numberWithInt:480], kIOSurfaceHeight,
nil];
IOSurfaceRef surf = IOSurfaceCreate((CFDictionaryRef)dict);
uint32_t seed = 0;
NSLog(@"seed 0: %d", IOSurfaceGetSeed(surf));
if (IOSurfaceLock(surf, 0, &seed) == 0)
{
NSLog(@"seed 1: %d", seed);
if (IOSurfaceUnlock(surf, 0, &seed) == 0)
{
NSLog(@"seed 2: %d", seed);
}
}
运行代码时的输出是
seed 0: 0
seed 1: 1
seed 2: 1
Apple标头文档指出,在锁定时,在解锁后会更新用于写入种子的表面,但此处在锁定之后已经更新了种子。所以我期望输出改为0、0、1。这是有关锁定的Apple标头文档:
“锁定”或“解锁” IOSurface以进行读取或写入。术语“锁定”在此上下文中宽松地使用,并且与 “解锁”信息以限制对原始IOSurface数据的CPU访问。如果seed参数为非NULL,则IOSurfaceLock()将存储缓冲区的 进行锁定调用时的内部修改种子值。你可以比较 此值等于先前返回的值,以确定缓冲区的内容 自上次锁定以来已更改。 对于IOSurfaceUnlock(),返回的种子值将是内部的 解锁时的种子值。如果锁定了写入缓冲区,则此值 随解锁执行而增加,并且将返回新值。 有关更多信息,请参见kIOSurfaceLock枚举。 注意:锁定和解锁IOSurface并不是特别便宜的操作, 因此请务必避免拨打电话。种子值是 对于保留缓冲区内容的缓存特别有用。
使用IOSurface在进程之间共享时,我需要知道实际何时更新表面。我的代码中有错误还是Apple文档和功能之间不匹配?