1、 尽量少在Update、OnGUI等函数中用临时变量。不要在Update中有太复杂的计算, 即便是一定要有,也要在几帧后计算一次。
2、 尽量少用float这类的复杂数算,用int代替,尤其是在手机游戏中。
3、 System.GC.Collection(); Collection(telikeshen收集)适当的用垃圾回收机制清理垃圾,
例如:
If(Time.frameCount%50 == 0) { System.GC.Collection(); } 4、 运行时尽量减少 Tris (chuaisi三角面)和 Draw Calls(zhuangkou绘制次数)
5、 避免大量使用 Unity 自带的 Sphere(s pi er球) 等内建 Mesh(maishi网格)。因为unity
内建的球体和网格的三角面太多。会使 Tris 和 Draw Calls 提升。
6、 如果可能,将GameObject上不必要的脚本disable(禁用)掉。如果你有一个大的场
景在你的游戏中,并且敌方的位置在数千米意外,这是你可以disable(禁用)你的敌方AI脚本直到它们接近摄像机为止。一个好的途径来开启或关闭GameObject是使用SetActiveRecursively(false),并且球形或盒型碰撞器设
7、 删除空的Update方法。当通过Assets目录创建新的脚本时,脚本里会包括一个Update方法,当你不使用时删除它。
引用一个游戏对象的最合乎逻辑的组件。有人可能会这样写someGameObject.transform,gameObject.rigidbody.transform.gameObject.rigidbody.transform,但是这样做了一些不必要的工作,你可以在最开始的地方引用它,像这样: privateTransformmyTrans; void Start() {
myTrans=transform; }
(尽可能的引用一个对象,查找gameobjeect会增加系统的消耗)
8、 协同是一个好方法。可以使用协同程序来代替不必每帧都执行的方法。(还有
InvokeRepeating方法也是一个好的取代Update的方法)。
9、 尽可能不要再Update或FixedUpdate中使用搜索方法(例如GameObject.Find()),你可以像前面那样在Start方法里获得它。
10、 不要使用SendMessage(发送消息)之类的方法,他比直接调用方法慢了100倍,
你可以直接调用或通过C#的委托来实现。
11、 定时重复调用可以使用InvokeRepeating(重复调用)函数实现,比如,启动0.5秒后
1秒执行一次DoSomeThing函数:InvokeRepeating(\"DoSomeThing\", 0.5f, 1.0f);
12、
尽可能共用材质。
将不需要移动的物体设为Static(静态的),让引擎可以进行其批处理。 尝试用压缩贴图格式,或用16位代替32位。 如果不需要别用雾效(fog) 用天空盒去“褪去”远处的物体。
注意碰撞体的碰撞层,不必要的碰撞检测请舍去。
13、
14、
15、
16、
17、
18、移动端优化可以采用用光照贴图(Lightmapping)去烘培一个静态的贴图,以代替每次
的光照计算,在U3D中只需要非常短的时间则能生成。这个方法能大大提高效率,而
且有着更好的表现效果(平滑过渡处理,还有附加阴影等)。
在移动设备上和低端电脑上尽量不要在场景中用真光,用光照贴图。这个方法大大节省了CPU和GPU的计算,CPU得到了更少的DRAWCALL,GPU则需要更少顶点处理和像素栅格化。
19、LOD 、 Per-Layer Cull Distances 、 Occlusion Culling
LOD (Level Of Detail) 是很常用的3D游戏技术了,其功能理解起来则是相当于多重纹理贴图。在以在屏幕中显示模型大小的比例来判断使用高或低层次的模型来减少对GPU的传输数据,和减少GPU所需要的顶点计算。
摄像机分层距离剔除(Per-Layer Cull Distances):为小物体标识层次,然后根据其距离主摄像机的距离判断是否需要显示。
遮挡剔除(Occlusion Culling)其实就是当某个物体在摄像机前被另外一个物体完全挡住的情况,挡住就不发送给GPU渲染,从而直接降低DRAW CALL。不过有些时候在CPU中计算其是否被挡住则会很耗计算,反而得不偿失。
20、采用高效的
shader
a.需要注意的是有些(built-in)Shader是有mobile版本的,这些大大提高了顶点处理的性能。当然也会有一些。
b.自己写的shader请注意复杂操作符计算,类似pow,exp,log,cos,sin,tan等都是很耗时的计算,最多只用一次在每个像素点的计算。不推荐你自己写normalize,dot,inversesqart
操作符,内置的肯定比你写的好。
c.需要警醒的是alpha test(阿尔法测试),这个非常耗时。
d.浮点类型运算:精度越低的浮点计算越快。
在CG/HLSL中--
float :32位浮点格式,适合顶点变换运算,但比较慢。
half:16位浮点格式,适合贴图和UV坐标计算,是highp类型计算的两倍。 fixed: 10位浮点格式,适合颜色,光照,和其他。是highp格式计算的四倍。
21、角色模型的优化建议
用单个蒙皮渲染、尽量少用材质、少用骨骼节点、移动设备上角色多边形保持在300~1500内(当然还要看具体的需求)、PC平台上1500~4000内(当然还要看具体的需求)。
22、尽量不使用动态光源
23、不轻易使用刚体,太消耗性能。 24、 25、 26、 27、 28、
29、
Unity引擎所具有的一些重要功能,例如Beast烘焙贴图技术、Umbra遮挡剔除技术、Navigation Mesh导航网格寻路技术、Shuriken粒子系统、Mecanim动画系统等,都是支持跨平台导出的。进一步地,Unity还针对移动平台提供了一整套简化的shader程序,使开发者能够以最小的代价在移动平台上取得酷炫的渲染画面和游戏效果。