私のゲームでは、リソース (フォント、テクスチャ、メッシュなど) を格納および管理するクラスであるリソース マネージャーの概念があります。非常に大まかに次の方法があります。
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 にラップする必要がありますか?
たとえば、メッシュ リソース:
struct MeshResource : public Resource
{
std::vector<vertex>* vertices;
std::vector<unsigned int>* indexes;
};
頂点とインデックスを std::shared_ptr にラップする必要がありますか? はいの場合 - shared_ptr に代わるもの (イディオム、またはパターンなど) はありますか? これは非常に大きなオーバーヘッドになるため、Resource サブクラスで 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 は定数 (アセット) リソースです。変更することはできませんが、いつでも読み取ることができます。