美文网首页
Unity 渲染框架报错

Unity 渲染框架报错

作者: 过雨烟蒙 | 来源:发表于2018-04-17 22:46 被阅读0次

    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文件中,有哪位仁兄知道的可以交流一下。


    相关文章

      网友评论

          本文标题:Unity 渲染框架报错

          本文链接:https://www.haomeiwen.com/subject/iptzyttx.html