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