Gamebryo 引擎基礎層之efd::MemObject

來源:互聯網
上載者:User

我們都知道C++中的記憶體管理是一個很讓人頭疼的問題,記憶體流失,無效指標訪問崩潰,堆記憶體配置失敗,記憶體片段等等問題。為瞭解決這些問題,大部分的遊戲引擎都實現了自己的記憶體管理器。GB中的MemObject 類有點類似於OGRE中的AllocatedObject,所有要從堆記憶體中構造的對象都必須繼承與該類。這個類重載了new和delete操作符,通過自己的記憶體管理器進行記憶體的管理。MemObject 介面分為debug和release兩種模式,通過EE_MEMORY_DEBUGGER宏我們可以指定debug模式,在這種模式下記憶體管理器會跟蹤所有對象的建立和銷毀過程,當發生錯誤時會把錯誤的發生點記錄在log中,以便於我們進行錯誤的修改。在這種模式下,需要耗費額外的資源和時間。

 

在實際的使用過程中,我們通過NiNew,NiDelete宏來建立和銷毀對象。實現記憶體管理器最普遍的方法是用使用記憶體池技術,即一次性批發申請一塊較大的記憶體,然後再把這塊較大的記憶體分成若干小塊記憶體以供使用。這樣可以有效地減小記憶體片段,提供者效能,並能夠解決記憶體流失的問題。具體的實現代碼可以參考boost庫中的pool類。

 

GB為了防止無效指標問題,特別引入了NiRefObject類,該類繼承自MemObject 。該類增加了引用計數的功能,類似於智能指標。很多情況下,我們需要複製堆積指標。複製堆積指標是很危險的一種操作,當我們定義一個指向動態對象的指標後,我們因為某種需要必須複製該指標進行相關操作。當我們把原指標delete後,如果我們再使用複製後的指標即會引起程式的崩潰,往往這類錯誤很難發現。為了避免這種情況,最好使用引用計數的方法,沒當複製一個後,引用計數+1.刪除的時候必須等到引用計數為0的時候才真正的delete該指標。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.