渲染速率优化
说道UI的优化肯定要说到 Drawcall,但其实Drawcall的优化也有很多的注意事项。
Drawcall注意事项
1 unity的Drawcall受画布,Pannel ,在NGUI中也会受UIwidge的depth的影响,也就是说在不同的画布,pannel等下,两个图片即使是相同的图集,也会有两个Drawcall,
2 应为unity的绘制机制是,从history中从上到下依次遍历,取材质相同没有中间层的放到一次draw call中,所以当两张图片的材质不同的时候,和有中间层的时候会额外消耗一次drawcall(中间层”是具有不同材料的图形对象,其边界框与两个其他可混合对象重叠,并且放置在两个可混合对象之间的层次结构中。中间层迫使批次被破坏),所以尽量少使用组合的图片,这样浪费多辆的Drawcall。
3 Drawcall也会受Y轴的影响(在上面都一样的情况下,在两个相同图集的图片中仿佛Y轴不同的图片,也会增加一个Drawcall),但是NGUI并不会,(只受UIwidge的depth)。
4 图集的图片也并不是越多越好,使用图集是为了减少向GPU传递的次数,因为每一次传递给GPU的耗时都会很长。但是如果一个超大的图集,呢么就会造成通往GPU的通道阻塞,反而会降低速率。
填充率优化
1 如果想使用图片隐藏不要把alpha设置为0,这样不会减少draw call,只有把gameobjct失活或者image失活才行。
2 有全屏的UI功能出现时,最好把被遮挡的UI界面隐藏掉,毕竟摄像机无论看不看得到,都会渲染到界面中。
3 禁用一些无用的摄像机,同样时出现全屏的UI时,把一些无用的摄像机禁用,因为只要摄像机拍到的,就会渲染,消耗Unity的性能。
4 unity重建,重建的过程是将画布的所有图片的布局和mesh(大小,缩放)重新计算一边。当画布变脏的时候,unity就会将整个画布重建(变脏是指影响UI对象外观的任何更改,包括分配给精灵渲染器的精灵,变换位置和比例,文本网格中包含的文本等),所以当一个画布拥有大量的UI元素的时候,每当有任意一个元素改变就会进行大量的计算,很是浪费性能。所以尽量一个功能一个画布。
5 untiy的点击事件点击的时候,是遍历具有或者是任何ICanvasRaycastFilter组件的子级(在任何深度),并且该Raycast Filter组件允许Raycast(意思是 在场景中所有具有Raycast的组件,都会遍历,在一些需要大地图地块的游戏中,将会是一个致命消耗)。 实现一个组件,在组件创建时Raycast默认改为false。
内存优化
1 使用unity自带的sliced,Tiled,filled功能,将图片进行变化成自己需要的图形。例如 背包的格子都是重复的,这时候完全可以用一个格子图片代替,然后使用tiled扩大重复就行了。(原则是美术尽量少给图,每一张图片都能有多重用途)
2 iOS平台使用PVRT压缩纹理,Adroid平台使用ETC1格式压缩。均可以减少3/4的内存。优化效果很明显。(ETC1值能支持非Alpha通道,所以一般先把Alpha通道图分离出来,当绘制时a值从Alpha图获取,而ETC2不需要,但是支持的机型较少。)
3 minmap的原理是创造出适合不同距离的图片,开启minmap会很占内存,所以在UI上面就不要使用,minmap这个功能。
4 手动控制GC的释放,减少因为GC一次释放过多而造成的卡顿(可以每半分钟一次)。