有各种不好的选择。
首先,如果你记录一个显示模式(即 cast toid
和 pass to NSLog(@"%@", ...)
),你会发现真正的像素编码在那里。这很有趣,但你真的不想解析那个描述。
如果你(__bridge CFDictionaryRef)@{ (__bridge NSString*)kCGDisplayShowDuplicateLowResolutionModes: @YES }
作为 options 参数传递给CGDisplayCopyAllDisplayModes()
,你会发现你得到了一堆额外的显示模式。此密钥记录在标题中,但未记录在参考文档中。对于 Retina 显示器,一些额外的模式是未缩放显示模式的 2 倍缩放对应物。其他是 30 位伪装成 24 位模式的 24 位对应物。这些在您可以通过 API 查询的所有方面都是相同的,但日志记录显示了差异。(顺便说一句,尝试切换到其中一种模式将会失败。)
我认为,但您必须验证,除了支持 30 位颜色的显示器外,您不会获得这对看似相同的模式。
您也许可以从 IOKit 获取信息。您必须使用已弃用的函数来获取表示 GPU 显示对CGDisplayIOServicePort()
的对象的服务端口。IOFramebuffer
然后,您可以使用IORegistryEntrySearchCFProperty()
搜索服务平面中的包含层次结构来查找具有“display-bpc”或“display-pixel-component-bits”等属性的对象并获取其值。至少,在我能够测试的几个系统上存在这样的对象和属性,尽管它们都使用 AMD GPU,并且该属性位于 AMD 特定的对象上,因此它可能不可靠。
最后,您可以启动一个子流程来运行system_profiler -xml SPDisplaysDataType
并使用 property-list-serialization API 从生成的 XML 构建一个属性列表对象。然后,您可以在其中找到信息。您可以通过_spdisplays_display-vendor-id
与CGDisplayVendorNumber()
、_spdisplays_display-product-id
和匹配找到相关显示CGDisplayModelNumber()
。然后,深度在 key 下,其中的值表示 30 位颜色。_spdisplays_display-serial-number
CGDisplaySerialNumber()
spdisplays_depth
CGSThirtyBitColor
您还应该向 Apple 提交错误报告,要求以合理的方式执行此操作。