Unity 渲染框架報錯

override

今天發包的時候發現一個很拐杖的問題,之前版本好好的,突然之間就開始在蘋果手機奔潰,主要復現在ios9(iPhone 6P)上,查了半天發現是Metal引起的錯誤,禁用掉之后就好了。我的Unity環境是5.5.2.f1。

bug日志

Metal GPU Frame Capture Enabled
failed assertion _interposeHandle != NULL at /BuildRoot/Library/Caches/com.apple.xbs/Sources/Metal/Metal-56.7/Framework/MTLDevice.mm:112 MTLInitializeInterpose

具體文件是在Unity自動生成的文件UnityAppController+Rendering.mm中

static bool IsMetalSupported(int /*api*/)
{
    _MetalBundle = [NSBundle bundleWithPath:@"/System/Library/Frameworks/Metal.framework"];
    if(_MetalBundle)
    {
        [_MetalBundle load];
        //報錯就在下面這行代碼
        _MetalDevice = ((MTLCreateSystemDefaultDeviceFunc)::dlsym(dlopen(0, RTLD_LOCAL|RTLD_LAZY), "MTLCreateSystemDefaultDevice"))();
        if(_MetalDevice)
            return true;
    }

    [_MetalBundle unload];
    return false;
}

解決方案一

在edit scheme中手動這只GPU Frame Capture選項,設置值為OpenGL ES,Metal API Validation 設置為Disable,如圖配置之后運行程序就可以正常運行了


EditScheme.jpg

解決方案二

在Unity中直接配置Graphics API。首先打開Unity工程的Player Settings(快捷鍵:shift + command + B),確認工程切換到了ios平臺,然后在Unity右邊欄的Other Setting中找到Auto Graphics API,去掉默認的選中復選框,然后在下面graphics APIs中只保留OpenGLES2,去掉默認的Meta,然后導出Xcode工程,確保工程中沒有引用Metal.Framework,最后導出ipa,安裝,搞定。

PlayerSettings.png

GraphicsAPISetting.jpg

思考和疑問

雖然bug好像解決了,我還是有疑問。首先,UNity是支持Metal渲染的,為什么會在這里報錯?是因為版本Unity或者是IPhone的版本太低導致的低版本bug還是什么?其次在這個問題上延伸,我們在從Unity自動構建iOS程序的時候如何自動配合scheme中的GPU Frame Capture選項,而不是每次手動配置。關于配置選項我個人測試了一下,即便是在Unity的setting中設置渲染方式為OpenGL,導出的Xcode工程默認還是Aumatically,這個不知道在哪配置,我查看了一下并不在project.pbxproj文件中,有哪位仁兄知道的可以交流一下。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容