iOSurface锁定问题

时间:2018-08-06 11:53:24

标签: objective-c macos iosurface

我在修改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文档和功能之间不匹配?

0 个答案:

没有答案