腾讯C#脚本GC测试真相

string使用+号拼接 和 stringbuilder

void testStringBuilder_plus()

{

 string test = "abc" + "efg" + "h";

int index = test.Length;

}

 

void testStringBuilder_StringBuilder()

{

StringBuilder testData = new StringBuilder();

testData.Append("abc");

testData.Append("efg");

testData.Append("h");

string test = testData.ToString();

}

 

数据结论

不同的使用场景结果是不同的,+ 号在几次连接中没有产生 GC。而在大量的连

接过程中,产生大量的 GC。

意义

连接次数只有几次(10 以内),此时应该直接用 + 号连接,不产生 GC。实际

上,编译器已经做了优化。

其余的使用 StringBuilder,StringBuilder 内部 Buffer 的缺省值为 16,

按 StringBuilder 的使用场景,Buffer 肯定得重新分配。经验值一般用 256 作

为 Buffer 的初值。当然,如果能计算出最终生成字符串长度的话,则应该按这

个值来设定 Buffer 的初值。使用 new StringBuilder(256) 就将 Buffer 的初始

长度设为了 256。

struct 和 class 比较

数据结论

Struct 在栈中不产生 GC,class 在堆中,会产生 GC。

对 Struct 的结点修改时,修改完以后记得重新赋值。因为 Struct 赋值是 copy

而不是引用,修改完以后,以前的不生效。

意义

堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些。

结构表示轻量对象,并且结构的成本较低,适合处理大量短暂的对象。

在表现抽象和多级别的对象层次时,类是最好的选择。

大多数情况下该类型只是一些数据时,结构是最佳的选择。

Enum 真相

数据结论

TestStr() 有装箱发生。

TestDic(),在构造集合的时候,也会有 GC 的产生。

意义

不要把枚举当 Tkey 使用,不要把枚举转成 string 使用。

 

协成

腾讯C#脚本GC测试真相_第1张图片

Component 相关优化

Transform

使用内建的数组,比如用 Vector3.zero 而不是 new Vector(0, 0, 0);

transform.localRotation = Quaternion.Euler(Vector3.zero);

transform.localScale =Vector3.one;

transform.localPosition =Vector3.one;

GameObject 相关优化

(脚本和本地引擎 C++代码之间的通信开销)

Gameobject 缓存:类似组件的缓存策略。

查找对象标签:if (go.CompareTag (“xxx”)来代替 if (go.tag == “xxx”),

因为内部循环调用对象分配的标签属性以及拷贝额外内存。

SendMessageUpwards、SendMessage:少用这两个函数,使用委托替代。

缓存组件:调用 GetComponent 函数耗性能,用变量先缓存到内存在使用, 有

必要时记得更新缓存组件。

未完待续.................

你可能感兴趣的:(优化)