一丶优化 1)、定时重复处理用InvokeRepeating 函数实现 例如: void Start() { InvokeRepeating ("DoSomeThing", 0.5f , 1.0f); //启动0.5秒后每隔1秒执行一次 DoSomeThing 函数; }
2)、尽量避免每帧处理 例如: void Update() { DoSomeThing(); } 改为: void Update() { if(Time.frameCount%5 == 0) //每帧处理改为每5帧处理一次; { DoSomeThing(); } }
3)、优化 Update, FixedUpdate, LateUpdate 等每帧处理的函数 例如: void Update() { Vector3 pos = transform.position; } 改为: private Vector3 pos; void Update() { pos = transform.position; }
4)、主动垃圾回收 //给某个对象GameObject绑上以下代码; 例如: void Update() { if(Time.frameCount%50==0) { System.GC.Collect(); } }
5)、运行时尽量减少 Tris 和 Draw Calls 例如: 预览的时候 , 点开Stats , 查看图形渲染的开销情况 ; 特别注意 Tris 和 Draw Calls 这两个参数。 一般来说 , 要做到 : Tris 保持在 7.5 K 以下 Draw Calls 保持在 20 以下
6)、压缩 Mesh 例如: 导入 3D 模型后,在不影响显示效果的前提下,最好打开 Mesh Compression; Off,Low,Medium,High 这几个选项,可酌情选取。
7)、避免大量使用 Unity 自带的 Sphere 等内建 Mesh
例如: Unity 内建的Mesh,多边形的数量比较大,如果物体不要求特别圆滑,导入其他的简单3D模型代替。
8)、优化数学计算
例如: 如果可以避免使用浮点型(float),尽量使用整形(int),尽量少用复杂的数学函数比如 Sin 和 Cos 等等。
9)、减少固定增量时间
例如: 将固定增量时间值设定在0.04-0.067区间(即,每秒15-25帧); 你可以通过 Edit --> Project Settings --> Time 来改变这个值 。 这样做可以降低 FixedUpdate 函数被调用的频率以及物理引擎执行碰撞检测与刚体更新的频率;假如你使用了较低的固定增量时间 并且在主角身上使用刚体部件,那么你可以启用插值办法来平滑刚体组件。
10)、减少 GetComponet 的调用
例如: 使用 GetComponet 或者内置组件访问器会产生明显的开销;你可以通过一次获取组件的引用避免开销,并将该引用分配给一个
变量(有时称为"缓存"的引用)。如: void Update() { transform.Translate(0,1,0);
} 改为: private Transform myTransform; void Awake() { myTransform = transform;
} void Update() { myTransform .Translate(0,1,0);
}
例如: 你应该避免分配新的对象,除非你真的需要,因为对象不在使用时,会增加垃圾回收系统的开销;你可以经常重复使用数组和其他对象,而不是分配新的数组 或对象;这样做好处是尽量减少垃圾的回收工作;同时,在某些可能的情况下,你也可以使用结构(struct)来代替类(class);这是因为,结构变量主要存 放在栈区而非堆区;因为栈的分配较快,并且不调用垃圾回收操作,所以当结构变量比较小时可以提升程序的运行性能;但是当结构体较大时,虽然它仍可避 免分配/回收的开销,而它由于"传值"操作也会导致单独的开销,实际上它可能比等效对象类的效率还要低。
|