iOS代码在运行时识别金属支持?

Viv*_*vam 12 objective-c ios metal

通常,我使用以下代码来识别设备的iOS版本.

if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
Run Code Online (Sandbox Code Playgroud)

以类似的方式,我试图找到设备的金属支持.使用A7(或更好)GPU和iOS 8.0的Apple设备支持Metal.

这是我希望我的代码工作的方式:

if (MetalSupported == true) {
  // metal programming
} else {
  // opengles2 programming
}
Run Code Online (Sandbox Code Playgroud)

如何获取布尔变量的值MetalSupported

ric*_*ter 17

你正在寻找特定于Metal的东西是好的 - 通常,iOS版本检查和硬件名称检查是脆弱的,因为它们依赖于你的应用程序知道所有可以运行它的操作系统版本和设备.如果Apple要回去发布一个增加了Metal支持的iOS 7.x版本(好吧,似乎不太可能),或者支持Metal的设备,但不是你正在寻找的硬件名称之一(似乎更有可能) ),你将无法跟踪所有这些事情,并更新你的应用程序来管理它们.

无论如何,检查您运行的设备是否足够金属以获得令人敬畏的图形代码的最佳方法是什么?只是尝试获取一个MTLDevice对象:

id<MTLDevice> device = MTLCreateSystemDefaultDevice();
if (device) {
    // ready to rock 
} else {
    // back to OpenGL
}
Run Code Online (Sandbox Code Playgroud)

请注意,只测试Metal框架类的存在并没有帮助 - 这些类在任何运行iOS 8的设备上都存在(一直回到iPhone 4s和iPad 2),无论该设备是否具有Metal功能GPU.

另请注意,iOS模拟器中没有Metal框架,因此MTLCreateSystemDefaultDevice()如果您要进行模拟器测试(不使用GPU API的应用程序部分),您需要在此处和任何其他Metal代码中添加一些内容.因为即使对于GL,模拟器也不是设备GPU性能的模仿者.


Jer*_*oia 8

在iOS上,你应该检查一下MTLCreateSystemDefaultDevice().如果它返回一个有效的设备,你很高兴.在macOS上,你需要小心; 用于[MTLCopyAllDevices() count]确定您是否有任何支持的金属设备可用.

您应该避免MTLCreateSystemDefaultDevice()在macOS上使用,因为这会强制多路复用开关切换到独立的GPU(例如:如果您正在处理在分立和集成图形之间自动切换图形的笔记本电脑).