这几天对项目的优化的过程进行整理:
1. Update中不能频繁的new新的对象
2. 频繁创建的对象需要使用缓存
3. 尽量少的使用Debug.Log
4. 代码中尽量少的使用高级特性,比如foreach尽量使用for或者使用Enumerator去访问,不使用Linq语句等
5. string.format、泛型的使用要注意,在Update中使用的时候可能造成频繁的GC,如使用Compare(TValue,TValue),val = Dictionary.this[Tkey]
6. 当使用未知的函数时,或使用插件时,尽可能的了解内部实现或测试插件本身的效率。如:WaveMesh插件Update函数的实现
void Update(){
//...............省略...................
Vector3[] verts = meshFilter.mesh.vertices;
//...............省略...................
}
mesh.vertices:返回一个顶点位置的数组值,或者为一组新的顶点位置数组赋值(http://www.ceeger.com/Script/Mesh/Mesh.vertices.html 这种解释有误),英文解释:Returns a copy of the vertex positions or assigns a new vertex positions array.(http://docs.unity3d.com/ScriptReference/Mesh.html),拷贝或重新分配顶点数组,因此还是得看英文文档啊。。。
在Unity的profiler中显示该句话每帧消耗的内存为1k ~ 2k,非常的浪费啊。。。
官方的示例:
“`
var newVertices : Vector3[];
var newUV : Vector2[];
var newTriangles : int[];
function Update () {
var mesh : Mesh = GetComponent.().mesh;
mesh.Clear();
// Do some calculations...
mesh.vertices = newVertices;
mesh.uv = newUV;
mesh.triangles = newTriangles;
}
`解决方法是 缓存 vertices,在Start中使用verts = meshFilter.mesh.vertices;已经在项目中测试过可行。
这示例代码也是非常的坑的,所以使用的时候要注意
优化内存是从一点一滴开始的,不要以为一点内存的开销没什么, 当很多开销加起来就产生了质的变化(游戏就变的无法忍受了)