真机适配问题记录(一)
开发大量含有自定义天气、植被后处理等AAA材质的时候,难以避免有大量真机的GPU适配问题,在此记录一下一些棘手的问题,以供日后自己查阅,或者也能帮助到正在看此文章的您~
草的花屏问题
出现机型:vivo X20A、魅族16TH、小米Mix2,都是高通骁龙机器
特征:草的颜色无法正常表现,各种颜色都有。
原因:在部分骁龙芯片中,同一个Shader的uniform不能超过32个。而草的Shader的uniform已超过32个
解决方案:删除或合并uniform即可。
Caused GPU Hang Error (IOAF code 3)
或者
validateFunctionArguments:3476: failed assertion `Vertex Function(xlatMtlMain): missing buffer binding at index 3 for vertexBuffer.0[0].’
Execution of the command buffer was aborted due to an error during execution. Ignored (for causing prior/excessive GPU errors) (IOAF code 4) 类似的,GPU Hang错误。
表现是游戏渲染卡死,但是游戏逻辑仍在运行,声音音效正常。
打开Metal API Validation Disabled和Metal Shader Validation 都无法查出有用信息。
相关类似问题:
https://forum.unity.com/threads/iphone-8-a11-gpu-hang-error-command-buffer.500549/
最终定位是LOD切换模型,模型的顶点在渲染阴影的时候在GPU越界导致的。
Mesh粒子在真机(AB模式)无法显示
表现:使用Render为Mesh的粒子,在Editor(Assetdatabase读取)下能正常显示,但是在真机/AssetBundle模式下会渲染不出来,也没有drawcall。
原因:参考https://issuetracker.unity3d.com/issues/texture-on-particle-is-not-displayed-when-the-particle-and-mesh-are-put-into-different-asset-bundles
如果Mesh和ParticleSystem(Prefab),在同一个AB下,则不会有问题;如果不在同一个AB下,就是会出现显示不出来的情况。这是原生管线不可修复的一个bug。
解决方案: 1、使用ScriptableBuildpipeline代替原生管线
2、修改fbx文件配置,打开Read/Write Enable(现在使用的方案),此方案会导致Mesh内存翻倍