1. 程式人生 > 實用技巧 >Unity中的string gc優化

Unity中的string gc優化

在專案中如果有大量的字串拼接,比如每秒執行的倒計時,協議中的日誌輸出,每次拼接會產生大量的gc,尤其是在ILRuntime下執行 gc alloc的次數會更加頻繁。

zstring

有兩個字串處理的庫都叫zstring,其中小寫的zstring是一款國人開源的zstring,而大寫的ZString是日本的CySharp公司的

國人的zstring:https://github.com/871041532/zstring

ZString:https://github.com/Cysharp/ZString

經測試zstring在update中是0gc,而ZString還有gc,短字串處理,會比原生string慢一些,我的測試環境:Unity2019.3.4f1

gc分配值:string >ZString >zstring

執行耗時:zstring >ZString >string

易用性:string>zstring>ZString

測試程式碼

void Update()
{
	Profiler.BeginSample("zstring=============concat");
	ZString.Concat("abc", 1);
	Profiler.EndSample();
	
	Profiler.BeginSample("string=============concat");
	string.Concat("abc", 1);
	Profiler.EndSample();
	
	Profiler.BeginSample("cn-zstring=============concat");
	using (zstring.Block())
	{
		zstring.Concat("abc",1);
	}
	Profiler.EndSample();
	
	Profiler.BeginSample("zstring=============format");
	ZString.Format("hello,{0}",1111);
	Profiler.EndSample();
	
	Profiler.BeginSample("string=============format");
	string.Format("hello,{0}",1111);
	Profiler.EndSample();
	
	Profiler.BeginSample("cn-zstring=============format");
	using (zstring.Block())
	{
		zstring.Format("hello ,{0}",1111);
	}
	Profiler.EndSample();
}

ZString和string gc對比

Method Allocated(B) Mean(ns) Mean(ns)
StringPlus 224 126.66 126.66
ZStringConcat 56 96.95 96.95
StringFormat 128 158.21 158.21
ZStringFormat 56 185.36 185.36
StringBuilder 296 144.2 144.2
ZStringBuilder 56 131.68 131.68

結論

個人而言更傾向於使用國人開發的zstring,它只有一個程式碼檔案,放Plugins目錄下就可以使用,相對而言上手更容易

Unity的建議

關於記憶體管理可看這篇: https://docs.unity3d.com/cn/current/Manual/UnderstandingAutomaticMemoryManagement.html

其中有條建議,對於需要頻繁拼接的字串,先判斷字串是否有變化,無變化則不需要拼接

對於字串的拼接,使用stringbuilder代替string,同時我也建議使用zstring代替string的+=

對於引數的傳遞,可以傳入引用型別,就不需要每次都構建一個新的物件