通常,我使用以下代码来识别设备的iOS版本.
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
以类似的方式,我试图找到设备的金属支持.使用A7(或更好)GPU和iOS 8.0的Apple设备支持Metal.
这是我希望我的代码工作的方式:
if (MetalSupported == true) { // Metal programming } else { // opengles2 programming }
解决方法
你正在寻找特定于Metal的东西是好的 – 通常,iOS版本检查和硬件名称检查是脆弱的,因为它们依赖于你的应用程序知道所有可以运行它的操作系统版本和设备.如果Apple要回去发布一个增加了Metal支持的iOS 7.x版本(好吧,似乎不太可能),或者支持Metal的设备,但不是你正在寻找的硬件名称之一(似乎更有可能) ),你将无法跟踪所有这些事情,并更新你的应用程序来管理它们.
无论如何,检查您运行的设备是否足够金属以获得令人敬畏的图形代码的最佳方法是什么?只是尝试获取MTLDevice对象:
id<MTLDevice> device = MTLCreateSystemDefaultDevice(); if (device) { // ready to rock ? } else { // back to OpenGL }
请注意,只测试Metal框架类的存在并没有帮助 – 这些类在任何运行iOS 8的设备上都存在(一直回到iPhone 4s和iPad 2),无论该设备是否具有Metal-有能力的GPU.
另请注意,iOS模拟器中没有Metal框架,因此如果您要进行模拟器测试(需要使用GPU API的应用程序部分),您需要在这个和任何其他Metal代码周围添加一些#ifs,因为即使对于GL,模拟器也是设备GPU性能的不良模仿者.