这两天在优化项目发现了以前项目里面一个可以优化的地方,同步上来记录一下。
首先是发现项目里面同一个模型多次创建drawcall并不会合并,翻阅了一下官方文档找到了原因如下:
- 合并的GameObject模型有顶点数限制,小于900顶点属性或300个顶点
- GameObject的scale有镜像缩放的不可以
- 材质球使用不同的实例个体也不行
- 光照贴图参数不同的也不行
- shader里面写了多个pass的也是NO NO NO
还有这个:
这里说只有Mesh Renderers, Trail Renderers, Line Renderers, Particle Systems, 和 Sprite Renderers会合并。其他诸如Skinned Meshes,Cloth等都不会合并。
简单看下来就是合并drawcall条件相当严峻。我们项目的模型都是使用的Skinned Mesh Renderer,这就解释了为什么我同一个鱼模型复制了N份就有N倍的drawcall。目前还没有找到好的相关的优化,如果各位有好的建议欢迎留言,感谢!
接着我就对运行时修改renderer的材质做了对比测验
测试描述:
在一个新的空工程中拖入我的模型,并写了简单的脚本生成300个复制体并每一定时间间隔(3秒)去修改鱼的颜色。
工程A:直接修改renderer.material.color字段
工程B:缓存两个材质球,他们唯一的区别就是颜色一个是白一个是红。然后要修改颜色的时候动态的切换renderer.material。注意,是切换,不是修改。
结果:
工程A:
CPU 内 存 GPU
工程B:
CPU 内 存 GPU
结论:
尽可能避免在运行时修改renderer的材质球。
可以通过shader或者切换材质球等方法实现。