UE4澜薄,內(nèi)存分配和跟蹤——方案設計原則

在穿插了內(nèi)存優(yōu)化之后为肮,我們回到內(nèi)存分配與跟蹤。接上次所說肤京,我想針對AAA游戲發(fā)布做必要的內(nèi)存分配和跟蹤颊艳,而不需大量時間來做內(nèi)存優(yōu)化。

方案需求

大多數(shù)AAA游戲有大量資源需要頻繁調(diào)入調(diào)出系統(tǒng)內(nèi)存和顯存忘分。在沙盒游戲中更嚴重棋枕,而大場景游戲(例如《NBA2015》)稍好些。不管怎樣妒峦,解決方案需要快速并提供正確的數(shù)據(jù)給所有的分配重斑。一個快速但不提供適當跟蹤工具的解決方案是不可取的,或提供了合適的跟蹤工具但速度很慢也是不行的舟山。兩項在衡量中都是很重要的绸狐。同時,所有分配必須通過它累盗,也就是說客戶端代碼或第三方庫不自己分配內(nèi)存寒矿,全局的new和delete操作應該override(重寫)。

跟蹤信息

解決方案必須提供相關(guān)的內(nèi)存跟蹤信息若债。其中符相,信息應包括所有的內(nèi)存占用,具體到某段內(nèi)存對應的分配地址蠢琳,包括所有內(nèi)存的啊终。任何內(nèi)存分配都需要有相關(guān)的跟蹤信息,什么時候分配的傲须,并可被程序員用來檢測問題蓝牲。

常規(guī)信息

提供的常規(guī)信息應該非常簡練。包括如下內(nèi)容:

分配字節(jié)數(shù)

分配次數(shù)

分配字節(jié)數(shù)峰值

分配次數(shù)峰值

內(nèi)存分配分組

就像有不同的小組或團隊一樣泰讽,說到游戲的不同功能時例衍,需要按組進行分配昔期。一些組用來渲染,游戲設置佛玄,UI硼一,音頻等等。不同分組有不同的內(nèi)存分配模式和需求梦抢。正因如此般贼,標準的內(nèi)存分組分配是個好主意,優(yōu)點如下:

優(yōu)化內(nèi)存分配設置奥吩。并不是所有分組都有同樣的分配需求哼蛆,所以最好是每組都可進行分配設置。也就是說比如:并不是所有組都需要互斥的分配器圈驼,并不是所有組都用同一個小塊分配器等等人芽。

預算跟蹤與強制執(zhí)行.每組分別擁有一定量RAM用來實現(xiàn)跟蹤,系統(tǒng)程序員可在不同組協(xié)調(diào)分配绩脆∮┨基本上,這就可以保證它們共享事務靴迫,所有內(nèi)存都在掌控之中惕味。

便于檢測崩潰問題。由于所有分配都有與組相對應的分配器設置玉锌,這就容易解決崩潰或在分配中出現(xiàn)的問題名挥。分組提供了良好的初始環(huán)境。

性能表現(xiàn)更優(yōu)主守。由于并不是所有的分組或分配都需要互斥禀倔,這些開銷可以避免。對于需要互斥分配器的組也會降低發(fā)生沖突的可能性参淫,因為并不只有一個互斥分配器(比如:全局分配器)加鎖救湖。在決定內(nèi)存分配方式時,要權(quán)衡絕對性能與內(nèi)存峰值二者涎才。

分配命名

為識別不同的分配鞋既,應該為所有的分配“命名”。名字表示誰需要內(nèi)存耍铜,也許可以強制命名規(guī)則邑闺,但為了跟蹤內(nèi)存分配,這些標簽應該是可以訪問的棕兼。為提高性能陡舅,這些標簽應該只在非發(fā)布版本上有效。

分配域

解決方案必須可以為每個線程的分配域的堆提供更多的上下文信息伴挚。它比使用堆棧的分配提供更好的上下文信息蹭沛,并且很容易獲取調(diào)用堆棧臂寝。在虛幻一個示例中,在UObject創(chuàng)建過程中創(chuàng)建域摊灭,這樣該Object相關(guān)的所有分配都在該域內(nèi)。所有非域內(nèi)的分配仍屬于全局域败徊。下面是作為葉節(jié)點分配域的示例和相關(guān)數(shù)據(jù):

Main Thread? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?Pointer? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???Bytes? ?? ???Group

Global Scope

UGameEngine::Init

/Game/Maps/LandscapeMap.umap

AddToWorld

PersistentLevel

ConstructObject

FPhysXAllocator::allocate? ?? ???0x000000000b093fe0? ?? ???131720? ?? ???Physics

分配標志

分配可根據(jù)分配器不同的含義來提供可選標志帚呼。比如:

生命周期標志。提供關(guān)于分配的生命周期的提示皱蹦。當減少分配的內(nèi)存碎片時煤杀,分配器會更加智能。

分配清空標志沪哺。分配器就可以在返回之前清空已分配的內(nèi)存沈自。

性能

即便是帶可跟蹤功能的非發(fā)布版本,解決方案也必需達到可被接受的性能辜妓】萃荆可接受就意味著在有內(nèi)存跟蹤的情況下,每幀耗時不能超過50ms籍滴。若超過這個值酪夷,用戶就會盡量避免使用跟蹤功能了,這是滑坡孽惰,不得不在最糟糕的時候即版本發(fā)布時恢復晚岭。當然,性能損失和常規(guī)消耗應該在發(fā)布版本時降到零勋功。

分配分組

為實現(xiàn)可能的最佳分配方法而不必大大提高客戶端代碼復雜度坦报,為每組定義多個分配器就是順理成章的。這些分配器可被順序調(diào)用狂鞋,每個分配器都會成功返回分配的內(nèi)存片择。比如:常規(guī)組有三個分配器:

靜態(tài)小塊分配器(SSBA)。它是靜態(tài)分配小塊的分配器要销,不會增長构回,接受最大分配空間為256字節(jié)。

動態(tài)小塊分配器(DSBA)疏咐。它是動態(tài)分配小塊的分配器纤掸,可根據(jù)需要動態(tài)增長,最大空間為1024字節(jié)浑塞。

全局分配器(SA)借跪。系統(tǒng)標準分配器,可分配任意大小內(nèi)存酌壕。

若需要1032個字節(jié)的內(nèi)存掏愁,就會先嘗試SSBA歇由,DSBA,最好向SA請求內(nèi)存果港。若一個分配器就可以滿足需求沦泌,那就只用一個好了。比如:使用jemalloc(譯者注:開源的內(nèi)存分配庫)辛掠,它使用合理的加鎖機制可實現(xiàn)不同大小的內(nèi)存分配谢谦。

聯(lián)系方式:0755-81699111

課程網(wǎng)址: http://www.vrkuo.com/course/vr.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市萝衩,隨后出現(xiàn)的幾起案子回挽,更是在濱河造成了極大的恐慌,老刑警劉巖猩谊,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件千劈,死亡現(xiàn)場離奇詭異,居然都是意外死亡牌捷,警方通過查閱死者的電腦和手機墙牌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宜鸯,“玉大人憔古,你說我怎么就攤上這事×苄洌” “怎么了鸿市?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長即碗。 經(jīng)常有香客問我焰情,道長,這世上最難降的妖魔是什么剥懒? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任内舟,我火速辦了婚禮,結(jié)果婚禮上初橘,老公的妹妹穿的比我還像新娘验游。我一直安慰自己,他們只是感情好保檐,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布耕蝉。 她就那樣靜靜地躺著,像睡著了一般夜只。 火紅的嫁衣襯著肌膚如雪垒在。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天扔亥,我揣著相機與錄音场躯,去河邊找鬼谈为。 笑死,一個胖子當著我的面吹牛踢关,可吹牛的內(nèi)容都是我干的伞鲫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼签舞,長吁一口氣:“原來是場噩夢啊……” “哼榔昔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瘪菌,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘹朗,沒想到半個月后师妙,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡屹培,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年默穴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褪秀。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蓄诽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出媒吗,到底是詐尸還是另有隱情仑氛,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布闸英,位于F島的核電站锯岖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏甫何。R本人自食惡果不足惜出吹,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辙喂。 院中可真熱鬧捶牢,春花似錦、人聲如沸巍耗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽芍锦。三九已至竹勉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間娄琉,已是汗流浹背次乓。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工吓歇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人票腰。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓城看,卻偏偏與公主長得像,于是被迫代替她去往敵國和親杏慰。 傳聞我的和親對象是個殘疾皇子测柠,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)缘滥,斷路器轰胁,智...
    卡卡羅2017閱讀 134,665評論 18 139
  • 從三月份找實習到現(xiàn)在芒涡,面了一些公司顷蟀,掛了不少,但最終還是拿到小米趾痘、百度擎颖、阿里榛斯、京東、新浪搂捧、CVTE驮俗、樂視家的研發(fā)崗...
    時芥藍閱讀 42,254評論 11 349
  • word直接復制來了,格式就不改了允跑。至于這門課怎么復習王凑,只要平時實驗都認真完成、報告認真寫吮蛹,平時分都很高荤崇;考試的話...
    Jozhn閱讀 4,560評論 0 8
  • 小小小小姑娘們,讓仙人拿滑板追她們個小不點潮针,滿院子追术荤,把孩子們累的夠嗆,喜歡讓叔叔追每篷?也是大姑娘叔叔都追膩了瓣戚,還是...
    縱情嬉戲天地間閱讀 226評論 0 0
  • 如果我說子库,我練習寫作是為了兒時夢想,這確實有點自欺欺人了矗晃。這快節(jié)奏的都市生活仑嗅,單單朝九晚五的工作和瑣碎繁冗的家務,...
    金gogo閱讀 379評論 4 3