gpt4 book ai didi

xcode - CGDirectDisplayID、多个 GPU、已弃用的 CGDisplayIOServicePort 和唯一标识显示器

转载 作者:行者123 更新时间:2023-12-01 19:36:41 37 4
gpt4 key购买 nike

我需要唯一地标识一个显示器,使其在特性上确实有所不同。因此,插入相同物理端口的相同型号的显示器不会被视为不同,但基本上其他一切都会被视为不同。

当系统 GPU 发生变化时,CGDirectDisplayID 也会发生变化,但不会以记录的方式发生变化。实验表明,根据使用的 GPU,相同的屏幕 ID 会相差 2。

CGDisplayID changing issues

克服这个问题的一种方法是获取用于显示的 IO 注册表字符串:

io_service_t  servicePort = CGDisplayIOServicePort (cgDisplayID);
io_service_t root = IODisplayForFramebuffer (servicePort, kNilOptions);
NSDictionary* ioRegistryDict = nil;
NSString* displayKey = nil;

IORegistryEntryCreateCFProperties (root, (CFMutableDictionaryRef *)&ioRegistryDict, kCFAllocatorDefault, kNilOptions);

if (ioRegistryDict)
displayKey = [ioRegistryDict objectForKey:@"IODisplayPrefsKey"];

这很有效,但在 10.9 中,CGDisplayIOServicePort 已被弃用。

鉴于所有这些,以及苹果建议不要缓存 NSScreens(无论如何,这实际上并不能用于此目的),可靠地识别屏幕的最佳方法是什么,以便我可以区分(例如)家里一个屏幕,工作一个屏幕?

我不想依赖屏幕分辨率,因为用户更改分辨率不应被视为不同的显示器。不同 GPU 上的同一屏幕也不应被视为不同。

第二个目标是找到一种给定 CGDirectDisplayID 的方法,如果发生 GPU 切换,如何确定同一屏幕的 CGDirectDisplayID 是什么?只要我能够匹配两个 GPU Controller 的两个结果,这至少允许我通过 CGDirectDisplayID 跟踪显示。

最佳答案

使用 CFUUIDRef,可以通过以下方式获取:

CGDisplayCreateUUIDFromDisplayID(CGDirectDisplayID 显示ID)您可以使用以下方法取回显示 ID:

CGDisplayGetDisplayIDFromUUID(CFUUIDRef uuid)

这就是我用来唯一标识显示器的方法,即使它们的 CGDirectDisplayID 发生变化,例如插入不同的端口。不幸的是,Apple 没有正确记录这些函数,但我在具有多个显示器的多台 Mac 上进行的测试表明,获得的 CFUUIDRef 是唯一且一致的(即使在重新启动后),无论 CGDirectDisplayID 是否因任何原因发生更改。

要检查显示器是否是新的/唯一的,请获取其CGDirectDisplayID并将其转换为CFUUIDRef,然后比较UUID,它是多对一的关系,许多CGDirectDisplayID将映射到单个CFUUIDRef。

这些 API 调用在 10.7 - 10.12 中的 ApplicationServices 中可用,并且从 10.13 起在 ColorSync 中可用。

关于xcode - CGDirectDisplayID、多个 GPU、已弃用的 CGDisplayIOServicePort 和唯一标识显示器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24348142/

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