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 list = new List();  
    Fun(list);
}

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

private List list = new List();  
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,游戏引擎)