簡體   English   中英

高效安全的資源管理

[英]efficient and safe resource management

在我的游戲中,我有一個資源管理器的概念,即存儲和管理資源(字體、紋理、網格等)的 class。 非常粗略地說,它有以下方法:

struct ResourceManager
{
template<class T>
std::shared_ptr<T> GetResource(id_type id) const
{
    auto pRes = std::dynamic_pointer_cast<T,Resource>(getResource(id));
    return pRes;
}

}
void load(); //loads resources from some storage
//etc.
};

后來,資源被一些游戲對象等獲取。所以,很明顯,Resource 必須被包裝到 shared_ptr 中。 但是 Resource 的內部數據呢? 它也應該被包裝到 shared_ptr 中嗎?

例如,Mesh 資源:

struct MeshResource : public Resource
{
std::vector<vertex>* vertices;
std::vector<unsigned int>* indexes;
};

應該將頂點和索引包裝到 std::shared_ptr 中嗎? 如果是 - 是否有 shared_ptr 的替代方案(成語或模式,任何東西)? 這是非常巨大的開銷,我想避免在資源子類中使用 shared_ptr。 另一方面,我想以某種方式保護數據。 例如,以下代碼必須啟動編譯錯誤。

delete pMeshResource->vertices;

有任何想法嗎?

我想出的解決方案:

struct MeshResource : public Resource
{
    const std::vector<unsigned int>& indexes() const;
    const std::vector<vertex>& get_vertices() const;
private:
    std::vector<vertex> vertices;
    std::vector<unsigned int> indexes;
};

MeshResource 是常量(資產)資源。 無法修改它,但您可以隨時從中讀取。

只把真正需要共享的東西放在堆上。 其他一切都應該在堆棧上。 困難的決定是要共享什么,不共享什么,這在很大程度上也取決於實際用例。

如果兩個網格共享頂點並且一個被一些變形修改,會發生什么? 另一個是否也會使用變形的頂點,或者您是否實施寫時復制以在要修改一個網格時立即為每個網格提供一組單獨的頂點?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM