【U3D性能优化教程——Mono内存篇】之二:StringBuilder的应用&字符串优化
本文由@唐三十胖子出品,转载请注明出处。
文章链接:https://blog.****.net/iceSony/article/details/83000611
这篇文章由唐三胖ヾ(•ω•`)o网络整理总结,针对Mono概念的系列优化教程。
通过这篇文章,你可以知道如何通过优化字符串减少GC
1.字符串拼接:用StringBuilder,同一块地址空间开辟
for (int i = 0; i < 100; i++) { String str1 = "img"+i; } StringBuilder sb = new StringBuilder(); for (int i = 0; i < 100; i++) { sb.Remove(0, sb.Length); //sb.Length = 0; 这种方式也会清空stringbuilder,但比remove慢 sb.Append("img").Append(i); }
尤其是在update中,性能差距非常大,每次都开辟新空间
StringBuilder sb = new StringBuilder(); void Update() { for (int i = 0; i < 100; i++) { String str1 = "img"+i; } for (int i = 0; i < 100; i++) { sb.Remove(0, sb.Length); sb.Append("img").Append(i); } }
2.字符串拼接:可以的话放到两个组件里
比如label拆成label1 label2
label.Text = “now time is ”+Time.deltaTime;
优化后
label1.Text = “now time is ” Label2.Text = Time.deltaTime
3.格式化字符串:非必要还用StringBuilder
如果不是需要改格式
String str = String.Format("{0:00}..{1:00}", num1, num2);
仅仅是字符串的拼接还是这么写
StringBuilder sb = new StringBuilder(); String str = String.Format("{0}..{1}", num1, num2); sb.Append(num1).Append("..").Append(num2);
4.字符串比较:用无gc版本对比替换==
普通的对比如下
String str1 ="Default"; String str2 = "Player(Clone)"; if (str1 == str2)//编译以后调用的还是equal方法 { //...... } if (str1.Equals(str2)) { //...... }
没有区别,但是如果str调用的是GameObject.tag或者GameObject.name都会产生GC
gameObject.CompareTag(str)替换== 比较,这是unity的无GC方法