爲了管理我遊戲中的各種資源(字體位圖等),我想創建管理器,將字符串映射到任何資源。而當這個對象超出範圍時,釋放資源使用的所有內存。這是一種可接受的資源管理方式嗎?
所以基本上如果你想要一個字體,你可以添加它或請求一個字符串指示其名稱,它會返回一個指針。這樣用戶永遠不必管理任何內存。
這是一款適合小型視頻遊戲的優秀設計嗎?
感謝
爲了管理我遊戲中的各種資源(字體位圖等),我想創建管理器,將字符串映射到任何資源。而當這個對象超出範圍時,釋放資源使用的所有內存。這是一種可接受的資源管理方式嗎?
所以基本上如果你想要一個字體,你可以添加它或請求一個字符串指示其名稱,它會返回一個指針。這樣用戶永遠不必管理任何內存。
這是一款適合小型視頻遊戲的優秀設計嗎?
感謝
您所描述的是工廠模式與智能指針/作用域指針相結合。
這是非常合理的。只要考慮你是否真的需要使用字符串來標識資源。枚舉可能就足夠了。
這聽起來有點像一個smart pointer,如果當它超出範圍會自動回收本身。
如果您的管理器返回普通指針,資源將一直存在,直到管理器本身被銷燬(效率低下,特別是對於位圖等資源而言),或者直到您明確地呼叫管理器才能獲取擺脫他們,這可能不會發生,如果例外拋出。經理可以返回某種類型的智能指針,這些智能指針可以在資源完成時通知經理。
+1這讓我想起了一個只能填滿的「緩存」實現,直到沒有任何內存可用爲止。雖然不是內存泄漏(技術上),但它仍然意味着內存消耗完全沒有約束* ahem * ... – 2011-04-18 16:04:06
@Matthieu這也是自定義內存分配器通過隱藏「解決」內存泄漏的常見問題。我相信早期的LISP實現。 – 2011-04-18 17:14:04
您可能需要考慮boost::intrusive_ptr,以便所有對象都被計算在內。如果需要,您可以在經理內部執行手動處理。
當然你也可以編寫自己的智能指針類,或者你可以把它從別人誰已經擁有:
http://www.boost.org/doc/libs/1_46_1/libs/smart_ptr/smart_ptr.htm
事實上,內存清理應禁食,字符串比較是最好的緩慢相比,枚舉。 – rubenvb 2011-04-18 15:56:42
這種方法相當合理,但並不完全描述。這聽起來像只有當整個管理器對象被銷燬時纔會釋放資源,而不再需要單個資源。所以單個資源不能用智能指針的方式進行管理。 – Wyzard 2011-04-18 15:57:05
@Wyzard嗯,我想它可以讀取兩種方式,但我雖然這OP意味着每個資源將被釋放,當它超出範圍。 – 2011-04-18 16:02:21