在穿插了內存優化之后,我們回到內存分配與跟蹤。接上次所說,我想針對AAA游戲發布做必要的內存分配和跟蹤,而不需大量時間來做內存優化。
方案需求
大多數AAA游戲有大量資源需要頻繁調入調出系統內存和顯存。在沙盒游戲中更嚴重,而大場景游戲(例如《NBA2015》)稍好些。不管怎樣,解決方案需要快速并提供正確的數據給所有的分配。一個快速但不提供適當跟蹤工具的解決方案是不可取的,或提供了合適的跟蹤工具但速度很慢也是不行的。兩項在衡量中都是很重要的。同時,所有分配必須通過它,也就是說客戶端代碼或第三方庫不自己分配內存,全局的new和delete操作應該override(重寫)。
跟蹤信息
解決方案必須提供相關的內存跟蹤信息。其中,信息應包括所有的內存占用,具體到某段內存對應的分配地址,包括所有內存的。任何內存分配都需要有相關的跟蹤信息,什么時候分配的,并可被程序員用來檢測問題。
常規信息
提供的常規信息應該非常簡練。包括如下內容:
分配字節數
分配次數
分配字節數峰值
分配次數峰值
內存分配分組
就像有不同的小組或團隊一樣,說到游戲的不同功能時,需要按組進行分配。一些組用來渲染,游戲設置,UI,音頻等等。不同分組有不同的內存分配模式和需求。正因如此,標準的內存分組分配是個好主意,優點如下:
優化內存分配設置。并不是所有分組都有同樣的分配需求,所以最好是每組都可進行分配設置。也就是說比如:并不是所有組都需要互斥的分配器,并不是所有組都用同一個小塊分配器等等。
預算跟蹤與強制執行.每組分別擁有一定量RAM用來實現跟蹤,系統程序員可在不同組協調分配。基本上,這就可以保證它們共享事務,所有內存都在掌控之中。
便于檢測崩潰問題。由于所有分配都有與組相對應的分配器設置,這就容易解決崩潰或在分配中出現的問題。分組提供了良好的初始環境。
性能表現更優。由于并不是所有的分組或分配都需要互斥,這些開銷可以避免。對于需要互斥分配器的組也會降低發生沖突的可能性,因為并不只有一個互斥分配器(比如:全局分配器)加鎖。在決定內存分配方式時,要權衡絕對性能與內存峰值二者。
分配命名
為識別不同的分配,應該為所有的分配“命名”。名字表示誰需要內存,也許可以強制命名規則,但為了跟蹤內存分配,這些標簽應該是可以訪問的。為提高性能,這些標簽應該只在非發布版本上有效。
分配域
解決方案必須可以為每個線程的分配域的堆提供更多的上下文信息。它比使用堆棧的分配提供更好的上下文信息,并且很容易獲取調用堆棧。在虛幻一個示例中,在UObject創建過程中創建域,這樣該Object相關的所有分配都在該域內。所有非域內的分配仍屬于全局域。下面是作為葉節點分配域的示例和相關數據:
Main Thread? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?Pointer? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???Bytes? ?? ???Group
Global Scope
UGameEngine::Init
/Game/Maps/LandscapeMap.umap
AddToWorld
PersistentLevel
ConstructObject
FPhysXAllocator::allocate? ?? ???0x000000000b093fe0? ?? ???131720? ?? ???Physics
分配標志
分配可根據分配器不同的含義來提供可選標志。比如:
生命周期標志。提供關于分配的生命周期的提示。當減少分配的內存碎片時,分配器會更加智能。
分配清空標志。分配器就可以在返回之前清空已分配的內存。
性能
即便是帶可跟蹤功能的非發布版本,解決方案也必需達到可被接受的性能。可接受就意味著在有內存跟蹤的情況下,每幀耗時不能超過50ms。若超過這個值,用戶就會盡量避免使用跟蹤功能了,這是滑坡,不得不在最糟糕的時候即版本發布時恢復。當然,性能損失和常規消耗應該在發布版本時降到零。
分配分組
為實現可能的最佳分配方法而不必大大提高客戶端代碼復雜度,為每組定義多個分配器就是順理成章的。這些分配器可被順序調用,每個分配器都會成功返回分配的內存。比如:常規組有三個分配器:
靜態小塊分配器(SSBA)。它是靜態分配小塊的分配器,不會增長,接受最大分配空間為256字節。
動態小塊分配器(DSBA)。它是動態分配小塊的分配器,可根據需要動態增長,最大空間為1024字節。
全局分配器(SA)。系統標準分配器,可分配任意大小內存。
若需要1032個字節的內存,就會先嘗試SSBA,DSBA,最好向SA請求內存。若一個分配器就可以滿足需求,那就只用一個好了。比如:使用jemalloc(譯者注:開源的內存分配庫),它使用合理的加鎖機制可實現不同大小的內存分配。
聯系方式:0755-81699111
課程網址: http://www.vrkuo.com/course/vr.html