项目优化技能是优秀研发人员的基本素质,除了遮挡剔除(Occlusion Culling)和层次细节(LOD)外,还可以从以下六个方面进行归纳和总结
# DrawCall
# 模型/图像方面
# 光照与摄像机处理
# 程序优化方面
# Unity系统设置
# 开发与使用习惯
1、DrawCall
一个模型的数据经过CPU传输到GPU,并命令GPU进行绘制,称为一个DrawCall。
这是一个CPU调用底层图形接口、绘制游戏对象的过程。对于GPU来说,一个游戏对象与大量游戏对象,其图形处理的工作量是一样的,所以尽量减少CPU在调用图形接口上的开销,每个游戏对象尽量减少渲染次数,多个游戏对象尽量一起渲染。
一般项目中,角色和场景是最消耗资源的两个方面,其中角色是CPU的瓶颈,场景是GPU的瓶颈。项目的优化与降低DrawCall的总体思路就是对美术资源进行梳理,使用大量合并DrawCall、人物角色减少材质与纹理的依赖和简化多余特效等方法。
具体途径:
①DrawCall批处理(DrawCall Batching技术)
Unity运行时可以将一些游戏对象进行合并,把多个游戏对象打包,在使用一个DrawCall渲染它们,称为“批处理”
批处理技术的核心就是在可见性测试之后,检查所有要绘制的对象材质,把相同材质分为一组,然后组合成一个对象
Unity提供了“动态批处理”和“静态批处理”两种方式,动态是完全自动进行的,对于顶点数在900以内的可移动物体,只要使用相同的材质,就会组成批处理。静态则需要把静止的物体标记为静态,勾选Static
②使用图集(Texture Paching或Texture Atlasing),减少材质的使用
Unity判断哪些游戏对象进行批处理,一般根据这些对象是否具有共同的材质和贴图,所有需要在场景中尽可能地复用材质到不同地对象上。
有效利用批处理,首先是尽量减少场景中使用材质的数量,即尽量共享材质,对于仅纹理不同的材质可以把纹理组合到一张更大的纹理中(称为图集)然后把不会移动的物体标记为Static
③尽量少用反光与阴影,因为那会使物体多次渲染
④视锥体合理裁剪
⑤遮挡剔除方法
⑥网格渲染器
把暂时无须显示的游戏对象使用脚本的方式控制不进行渲染,需要的时候渲染
⑦减少游戏对象的缩放
统一缩放的对象不会与非统一缩放的对象进行批处理
⑧减少多通道Shader的使用
多通道的Shader会妨碍批处理操作
⑨脚本访问材质的方法
如果需要通过脚本来访问复用材质属性,那么如果使用Renderer.material来改变贴图将会造成一份材质属性的更改。
因此一般应该使用Renderer.sharedMaterial来保证材质的共享状态。
⑩尽量多使用预设Prefab
2、模型/图形方面
①模型几何体的优化
#模型的顶点与三角形面片的数目等不要太多,可能的话,把相邻的对象(网格)合并为一个
#蒙皮动画模型的优化,建议每个角色仅使用一个蒙皮网格渲染器来绘制。在此情况下,Unity会使用可见性裁剪和包围体更新的方法来优化角色运动。角色的面数一般不要超过1500,骨骼数量少于30,角儿材质数量一般1~2个为最佳
#压缩面片
#避免大量使用Unity自带的Sphere等内建游戏对象
②贴图(纹理)优化
#使用贴图压缩优化
#贴图(纹理)压缩格式选择
纹理方面,使用压缩纹理,对于不透明贴图,压缩格式建议为ETC 4bit,对于透明贴图,我们只能选择RGBA 16bit或32bit
贴图的格式,从事手游开发,建议设置为PNG或TGA格式
#选择支持Mipmap
虽然这种做法会增加一些应用程序的大小,但在游戏运行时,系统会根据需求应用Mipmap来渲染,从而减少内存的带宽需求
③材质
④碰撞体
⑤粒子系统
最大粒子数建议小于200个粒子,每个粒子发射器的最大粒子数建议不超过50个
对于非常小的粒子,建议粒子纹理去掉Alpha通道,尽量不开启粒子碰撞功能
⑥其他
尽可能多地使用预设体,不要再静态物体上添加Animation组件
3、光照与摄影机方面
①渲染途径
渲染途径用于决定灯光和阴影在场景中地计算方法,Unity中主要提供了3种渲染途径,分别是“顶点光照”、“前向渲染”、“延时光照”
#延时光照
具备最高地保真度与真实感地渲染途径
#前向渲染
是一种保持较高光照效果与较高系统性能地综合平衡选项
#顶点光照
最低保真度光照,基本已经弃用
②光照与阴影方面
光线性能地消耗占用顺序为:聚光灯、点光源、平行光
像素的动态光照将对顶点变换增加显著的开销,所以应尽量避免任何给定的物体被多个光源同时照亮的情况
对于静态物体,采用光照烘焙的方法则更为有效的方法
③摄像机技巧
Unity提供了可以根据不同的层来设置不同的显示距离,我们可以将游戏对象进行分层,大物体层设置的可视距离大些,而小物体层可以设置地小些,一些开销比较大地实体(如粒子系统)可以设置得更小些。
4、程序优化方面
①程序整体优化方面
②事件函数方面
③数学计算方面
④垃圾回收机制方面
5、Unity系统设置
①限帧措施
Edit → ProjectSetting → Quality 中的VSync Count 参数会影响FPS
Every V Blank 相当于 FPS=60,EverySecondVBlank=30
手动调整FPS,首先关闭垂直同部功能,然后再代码Awake方法手动设置FPS
②物理性能优化
设置了FPS后,再调整下Fixed Timestep参数
Edit → ProjectSetting → Time 目的是减少物理计算的次数来提高游戏性能
③调整像素光数量
Edit → ProjectSetting → Quality 调整像素光的数量来取得一个性能和质量的均衡点
6、良好的开发与使用习惯
#养成良好的标签、层次和图层的条理化习惯
#项目研发过程中就养成经常通过stats和profile技术查看项目的效率瓶颈的习惯