Windows Phone游戲性能優(yōu)化之垃圾回收
垃圾回收(也稱GC)是解決XNA游戲性能問題首先要注意的問題,.net垃圾回收器在windows上表現(xiàn)得令人驚嘆,而且大部分情況下你不必理會(huì)它。但是在Xbox/Windows Phone 7上,這個(gè)情況有所改變。當(dāng)你的游戲出現(xiàn)持續(xù)掉幀的情況,垃圾回收器可能會(huì)讓你陷入困境:此時(shí)它會(huì)在每分配1mb內(nèi)存的時(shí)候被觸發(fā)一次。
在這里發(fā)一些有關(guān)XNA垃圾回收的小貼士,如果你的程序性能出現(xiàn)問題了,可以參考的提示。
在屏幕上畫出GC.GetTotalMemory()的返回值
這個(gè)可以使你監(jiān)控到你游戲分配內(nèi)存的近似值。如果這個(gè)值變化很慢,那么一切正常,如果增長地很快,你就該把它當(dāng)issue優(yōu)化了。
在程序最開始即給你的對(duì)象分配空間
如果你不在游戲開始就把一切都分配好空間,當(dāng)你在游戲時(shí)對(duì)它們分配空間時(shí)就會(huì)導(dǎo)致掉幀。道理很簡單:No allocations, no collections.
程序初始化加載完畢時(shí),調(diào)用GC.Collect().
如果你知道你的大對(duì)象已經(jīng)加載完畢,也讓系統(tǒng)知道它。
切忌在每幀調(diào)用GC.Collect().
每幀回收看起來是個(gè)好主意,可以時(shí)刻讓你的內(nèi)存處于***化的利用率。但是有一點(diǎn)要記住:比垃圾回收更糟糕的是過量地垃圾回收。
找出你的垃圾從何而來
有幾個(gè)典型的例子產(chǎn)生垃圾:使用string進(jìn)行字符串串聯(lián)操作(這里你可能會(huì)想到Stringbuilder,但是它也可能會(huì)導(dǎo)致巨量的內(nèi)存分配,理性地使用它們吧),在集合中使用 foreach遍歷對(duì)象也可能會(huì)在你不知道的情況下觸發(fā)垃圾回收(典型的例子:foreach (EffectPass pass in effect.CurrentTechnique.Passes))。
使用CLR性能監(jiān)視工具:CLRmemory profiler
在你使用了非托管資源的類中使用IDisposable
這么做了,你就可以回收掉GC不能回收的內(nèi)存。
【編輯推薦】