Unity中的性能优化

Posted Hello Bug.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity中的性能优化相关的知识,希望对你有一定的参考价值。

一:避免在同一帧调用多次Debug.Log

Debug.Log会产生GC,就算输出一个空的字符串也会,因为Debug.Log内部调用的String str = new String(“xxx”.ToCharyArray),如果一帧log太多次会影响性能,建议上线后使用Debug.unityLogger.logEnabled = false禁用掉所有log

private void Update()

    if (Input.GetKeyDown(KeyCode.Space))
    
        for (int i = 0; i < 9999; i++)
        
            Debug.Log("log");
        
    

二:Dictionary取值时使用TryGetValue

如果只是判断字典中某个值是否存在,使用Contains和TryGetValue都可以。如果需要判断是否存在之后再得到某个值,尽量使用TryGetValue
C#中Dictionary的TryGetValue和Contains


三:频繁字符串操作使用StringBuilder代替String

String是不可变的,每次修改都会分配一个新的内存空间而原内存空间就变成了垃圾,而StringBuilder是可变的,不会产生内存垃圾
C#中的String和StringBuilder

string str = "liu";
private void Update()

    str += "yiyi";

上面这种写法每次都会分配一个新的内存

StringBuilder sb = new StringBuilder("liu");
private void Update()

    sb.Append("yiyi");

上面这种写法只会在实例化时分配一次内存  


四:创建字符串时候使用直接赋值

创建字符串或修改字符串值的时候尽量要使用直接赋值(string str = “”),这样会被放入常量池中进行复用,减少没必要的内存分配
C#中的String和StringBuilder

string str1 = "Hello";
string str2 = "Hello";

上面这种写法只会在实例化时分配一次内存,再次使用相同面值的字符串时不会再次分配内存

string str1 = new string("Hello".ToCharArray());
string str2 = new string("Hello".ToCharArray());

上面这种写法每次都会分配一个新的内存 


五:运用缓存—减少频繁的内存分配

在频繁的函数中(例如Update、LateUpdate等)避免经常申请内存

void Update()  
  
    List<int> list = new List<int>();  
    Fun(list);

上面这种写法,每次new都会分配一次内存

private List<int> list = new List<int>();  
void Update()  
  
    list.Clear();  
    Fun(list);

上面这种写法,只有在list被创建或者需要扩容时才会有堆分配,从而减少了垃圾内存的产生 


六:协程中使用yield return null代替yield return 0

yield return 0会产生GC,因为int类型的0被装箱,而yield return null则不会产生装箱操作


七:协程中避免多次new同一个WaitForSeconds对象

while (!isComplete)  
  
    yield return new WaitForSeconds(1f);

上面这种写法每次循环都会分配一次新内存

WaitForSeconds delay = new WaitForSeconds(1f);  
while (!isComplete) 
  
  yield return delay;

上面这种写法只会分配一次内存

以上是关于Unity中的性能优化的主要内容,如果未能解决你的问题,请参考以下文章

Unity中的性能优化

UNITY性能优化丨ProtoBuf 在 Unity 中的详细使用教程

[Unity优化] Unity中的批处理优化与GPU Instancing

Unity NGUI性能优化

unity 简单的性能优化

Unity中的批处理优化与GPU Instancing