2012-04-07 61 views
0

在我的遊戲中,我有一個資源管理器的概念,它是一個存儲和管理資源(字體,紋理,網格等)的類。大致來說它下面的方法:高效安全的資源管理

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. 
}; 

後來,資源被一些遊戲對象,等後天所以,很顯然,資源必須被包裹成的shared_ptr。但是關於資源的內部數據呢?它是否也被包裝到shared_ptr中?

例如,網格資源:

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是恆定的(資產)的資源。修改它是不可能的,但你可以隨時讀取它。

+0

爲什麼要將頂點和索引作爲指針而不是按值? – pmr 2012-04-07 10:53:13

+0

,因爲每次我想獲取一些資源時,複製效率極低。 – innochenti 2012-04-07 10:54:50

+0

@inncohenti這就是爲什麼您的資源已被管理?如果真的有很多不同的網格共享同一組頂點的情況,這是完全正確的,但這取決於您的應用程序。 – pmr 2012-04-07 10:55:59

回答

1

只保留真正需要在堆上共享的內容。一切都應該在堆棧上。困難的決定是什麼是共享的,什麼不是,這也取決於實際使用情況。

如果兩個網格共享頂點,一個網格通過某種變形進行修改,會發生什麼?另一個人是否也會使用變形的頂點,或者是否實現了copy-on-write功能,以便在每個網格物體被修改後立即爲其分別設置頂點集合?

+0

網格頂點可能會被修改,但資源頂點不是。簡單圖像也是如此,可以用於紋理。或者甚至是字體對象。 – innochenti 2012-04-07 11:03:15

+0

@innochenti對不起,應該是什麼區別?通過資源,你是指「存儲」中的事物和「網格」頂點是實際存在於程序中的事物嗎? – pmr 2012-04-07 11:06:26

+0

將資源視爲常量對象。 – innochenti 2012-04-07 11:06:35