簡體   English   中英

iOS代碼在運行時識別金屬支持?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM