关于优化这块可以从四方面入手
1 减少文件的大小
2 优化DrawCalls
3 脚本代码的优化
4 内存的优化
首先关于unity优化首先要学会看分析器即Profiler,具体参数参考文档http://game.ceeger.com/Manual/Profiler.html;profiler
第一条减少文件大小,首先还是参考文档http://game.ceeger.com/Manual/ReducingFilesize.html
主要的工作还是压缩图片,至于说去掉多余的资源我这里就不说了,我这里做的是
把NGUI图集的图片RGBA32bit改为RGBA16bit这里压缩之后图片是变小了,同时相应的图片也失真的不少,不过只要主要的图片不压缩就行,这样减小了导出apk包的大小,又不影响用户体验,其他的要做的其实不多,主要还是参考官网,另外可以参考别人的总结
第二条优化DrawCalls这点我看的不多,因为这个游戏的DrawCalls已经可以了,大概在15到20之间,NGUI已经把图片合并到一张大图并公用材质球,不过关于这方面具体的可以看http://www.unitymanual.com/2420.html
http://www.unitymanual.com/3853.html
http://www.unitymanual.com/4702.html这里已经介绍很详细了,我就不多说了
第三脚本代码的优化,文档上也有关于这方面的内容http://game.ceeger.com/Script/Overview/Overview.Performance_Optimization.html
另外还有一些其他的总结http://wenku.baidu.com/view/f59a9d18a300a6c30c229ff2.html
http://blog.csdn.net/yesy10/article/details/7847926
这上面其实已经总结的很全了,脚本这块我没怎么改,我大概看了看其实要改的地方很少的,毕竟不是我写的代码,要做游戏优化从工程一开始就要开始做。
我这里也总结一下吧留作以后自己写代码需要注意的地方:
1 使用静态类型:官网上的例子
· C#
usingUnityEngine;
usingSystem.Collections;
public classexample : MonoBehaviour {
void Start() {
duck foo =GetComponent<MyScript>();
foo.DoSomething();
}
}
Here foo will be dynamically typed, thus calling the functionDoSomething takes longer than necessary - because the type of foo is unknown,it has to figure out whether it supports DoSomething function, and if it does,invoke that function.
这里foo将是动态类型,因此调用函数DoSomething必须要更长时间 – 因为foo的类型未知,它必须弄明白是否支持DoSomething函数,如果支持,就调用那个函数。
· C#
usingUnityEngine;
usingSystem.Collections;
public classexample : MonoBehaviour {
void Start() {
MyScript foo =GetComponent<MyScript>();
foo.DoSomething();
}
}
2 依然是官网上的
usingUnityEngine;
usingSystem.Collections;
public classexample : MonoBehaviour {
void Update() {
transform.Translate(0, 0,5);
}
}
Into this: 变成这样
· C#
usingUnityEngine;
usingSystem.Collections;
public classexample : MonoBehaviour {
private Transform myTransform;
void Awake() {
myTransform = transform;
}
void Update() {
myTransform.Translate(0, 0,5);
}
}
3如果不是必须,不要调用函数(还是文档中的)
4 尽量少使用FixUpdate,LateUpdate,Update最好使用协同代替
5 不要使用GUI,特别是手机上,
6尽量不要去获取组件,获取时最好写在Start或Awake里,
7尽量不要用Gameobject.Find();因为这样会遍历游戏场景中所有的物体,还有不要使用SendMessage,尽量用委任代替
8优化数学运算,尽量避免使用float,而使用int,特别是在手机游戏中,尽量少用复杂的数学函数,比如sin,cos等函数。改除法/为乘法,例如:使用x*0.5f而不是x/2.0f
9如果可能,将GameObject上不必要的脚本disable掉。如果你有一个大的场景在你的游戏中,并且敌方的位置在数千米意外,这是你可以disable你的敌方AI脚本直到它们接近摄像机为止。一个好的途径来开启或关闭GameObject是使用SetActiveRecursively(false),并且球形或盒型碰撞器设为trigger。
10、删除空的Update方法。当通过Assets目录创建新的脚本时,脚本里会包括一个Update方法,当你不使用时删除它
11同一脚本频繁使用的变量建议声明为全局变量,脚本之间频繁调用的变量或方法建议声明为全局静态变量或方法
另外关于Sync在移动设备上最好关闭,,具体的参考
http://blog.csdn.net/jixuguo/article/details/9018669
第四内存优化
先参考文档http://game.ceeger.com/Manual/UnderstandingAutomaticMemoryManagement.html