在我的遊戲中,我有一個資源管理器的概念,它是一個存儲和管理資源(字體,紋理,網格等)的類。大致來說它下面的方法:高效安全的資源管理
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是恆定的(資產)的資源。修改它是不可能的,但你可以隨時讀取它。
爲什麼要將頂點和索引作爲指針而不是按值? – pmr 2012-04-07 10:53:13
,因爲每次我想獲取一些資源時,複製效率極低。 – innochenti 2012-04-07 10:54:50
@inncohenti這就是爲什麼您的資源已被管理?如果真的有很多不同的網格共享同一組頂點的情況,這是完全正確的,但這取決於您的應用程序。 – pmr 2012-04-07 10:55:59