[英]iOS code to identify metal support in runtime?
通常,我使用以下代码来识别设备的iOS版本。
if ([[UIDevice currentDevice].systemVersion floatValue] >= 8.0)
以类似的方式,我试图找到设备的金属支持。 使用A7(或更好)GPU和iOS 8.0的Apple设备支持Metal。
这是我希望我的代码工作的方式:
if (MetalSupported == true) {
// metal programming
} else {
// opengles2 programming
}
如何获取布尔变量MetalSupported
的值?
你正在寻找特定于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。
在Simulator中,当在macOS 10.15上运行时,从iOS 13 / tvOS 13开始支持Metal。 使用相同的策略:调用MTLCreateSystemDefaultDevice()
。 如果它返回一个对象,则模拟器代码在模拟器硬件加速的环境中运行。 如果它返回nil
那么您将在较旧的模拟器上运行,或者在Metal不可用的环境中运行。
在iOS上,您应该只检查MTLCreateSystemDefaultDevice()
。 如果它返回一个有效的设备,你很高兴。 在macOS上,你需要小心; 使用[MTLCopyAllDevices() count]
确定您是否有任何支持的金属设备可用。
您应该避免在macOS上使用MTLCreateSystemDefaultDevice()
,因为这会强制多路复用开关切换到离散GPU(例如:如果您正在处理具有离散和集成图形之间自动图形切换的笔记本电脑)。
Ricster清楚地解释了在运行时识别支持金属的设备的所有方法。 如果你不能通过包含金属库在你的类中使用MTLCreateSystemDefaultDevice(),请使用设备信息(iOS版本,gpu / cpu架构),但是在使用设备信息时需要考虑Ricster解释的所有情况。
void deviceConfigurations(){
size_t size;
cpu_type_t type;
cpu_subtype_t subtype;
size = sizeof(type);
sysctlbyname("hw.cputype", &type, &size, NULL, 0);
size = sizeof(subtype);
sysctlbyname("hw.cpusubtype", &subtype, &size, NULL, 0);
}
使用Subtype和type变量来标识设备和其他信息。
我认为最好的方法是尝试获得其中一个金属类。
Class metalDeviceClass = NSClassFromString(@"MTLDevice");
BOOL isMetalAvailable = metalDeviceClass != nil;
if (isMetalAvailable) {
NSLog(@"Metal available");
} else {
NSLog(@"Metal not available");
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.