一:避免在同一帧调用多次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;
}
上面这种写法只会分配一次内存
版权归原作者 Hello Bug. 所有, 如有侵权,请联系我们删除。