牛骨文教育服务平台(让学习变的简单)
博文笔记

U3D内存优化原则

创建时间:2016-02-18 投稿人: 浏览次数:1732

这几天对项目的优化的过程进行整理:
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;已经在项目中测试过可行。
这示例代码也是非常的坑的,所以使用的时候要注意

优化内存是从一点一滴开始的,不要以为一点内存的开销没什么, 当很多开销加起来就产生了质的变化(游戏就变的无法忍受了)

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。