unity优化的一些建议(代码+文字)
最近看到了一些关于Unity优化的建议,在此分享给大家,先来看代码部分。
1. 隔帧处理不必要的每帧操作
如果某些操作没必要每帧都处理,那么可以隔几帧再进行处理。以下是示例代码:
// 每帧都处理
int length = myArray.Length;
for(int i = 0; i < length; i++)
{
DoSomething();
}
// 隔几帧再处理
void Update()
{
if(Time.frameCount % 6 == 0)
{
DoSomething();
}
}
这样做可以减少不必要的计算,提高性能。
2. 定时重复调用函数
定时重复调用可以使用InvokeRepeating函数实现。例如,启动0.5秒后每隔1秒执行一次DoSomeThing函数,代码如下:
void Start()
{
InvokeRepeating("DoSomeThing", 0.5f, 1.0f);
}
3. 减少临时变量的使用
特别是在Update、OnGUI等实时调用的函数中,应少使用临时变量。以下是错误和正确的用法示例:
// 错误用法
void Update()
{
Vector3 pos;
pos = transform.position;
}
// 正确用法
private Vector3 pos;
void Update()
{
pos = transform.position;
}
将变量声明为类的成员变量,可以避免在每次函数调用时都创建新的临时变量,减少内存开销。
4. 主动进行垃圾回收
可以在适当的时候主动进行垃圾回收,示例代码如下:
void Update()
{
if(Time.frameCount % 50 == 0)
{
System.GC.Collect();
}
}
不过要注意,频繁的垃圾回收也会影响性能,所以要选择合适的时机。
5. 优化数学运算
尽量避免使用float,而使用int,特别是在循环中,要尽量少用复杂的数学函数,比如sin、cos等函数。同时,将除法/改为乘法,例如使用x * 0.5f而不是x / 2.0f。这样可以提高计算效率。
6. 压缩Mesh
导入3D模型之后,在不影响显示效果的前提下,最好打开Mesh Compression。有Off、Low、Medium、High这几个选项,可根据实际情况酌情选取。并且对于单个Mesh,最好使用一个材质,以减少渲染开销。
7. 运行时减少Tris和Draw Calls
预览的时候,可点开Stats,查看图形渲染的开销情况,特别注意Tris和Draw Calls这两个参数。一般来说,要将Tris保持在7.5k以下,Draw Calls保持在35以下,以提高渲染性能。
8. 避免大量使用自带的内建Mesh
Unity内建的Mesh,如Sphere等,多边形的数量比较大。如果物体不要求特别圆滑,可导入其他简单的3D模型来代替,以减少多边形数量。
9. 禁用不必要的脚本
如果可能,将GameObject上不必要的脚本disable掉。例如,在一个大的场景中,如果敌方的位置在数千米以外,可以禁用敌方AI脚本,直到它们接近摄像机为止。一个好的开启或关闭GameObject的方法是使用SetActiveRecursively(false),并且将球形或盒型碰撞器设为trigger。
10. 删除空的Update方法
当通过Assets目录创建新的脚本时,脚本里会包含一个Update方法,当你不使用时,应及时删除它,避免不必要的函数调用。
11. 合理引用游戏对象的组件
引用一个游戏对象的最合乎逻辑的组件,避免进行不必要的操作。例如,不要写成someGameObject.transform、gameObject.rigidbody.transform.gameObject.rigidbody.transform这样复杂的形式,而是在最开始的地方引用它,示例代码如下:
private Transform myTrans;
void Start()
{
myTrans = transform;
}
12. 使用协同程序
协同程序是一个好方法,可以使用协同程序来代替不必每帧都执行的方法。InvokeRepeating方法也是一个好的取代Update的方法。
13. 避免在Update或FixedUpdate中使用搜索方法
尽可能不要在Update或FixedUpdate中使用搜索方法(例如GameObject.Find()),可以在Start方法里获取所需的对象引用,示例如下:
private GameObject targetObject;
void Start()
{
targetObject = GameObject.Find("Target");
}
14. 避免使用SendMessage方法
不要使用SendMessage之类的方法,它比直接调用方法慢了100倍,可以直接调用或通过C#的委托来实现相同的功能。
15. 确定变量类型
使用JavaScript或Boo语言时,最好确定变量的类型,不要使用动态类型,这样会降低效率。可以在脚本开头使用#pragma strict来检查,这样在编译游戏时就不会出现莫名其妙的错误。
通过以上这些优化建议,可以在一定程度上提高Unity项目的性能。