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

その後、リソースはいくつかのゲーム オブジェクトなどによって取得されます。したがって、明らかに、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 は定数 (アセット) リソースです。変更することはできませんが、いつでも読み取ることができます。

4

1 に答える 1

1

本当に共有する必要があるものだけをヒープに保持します。他のすべてはスタック上にある必要があります。難しい決定は、何を共有し、何を共有しないかであり、これも実際のユースケースに大きく依存します。

2 つのメッシュが頂点を共有し、1 つが何らかの変形によって変更された場合、どうなりますか? もう一方も変形された頂点を使用しますか、それともコピー オン ライトを実装して、1 つが変更されるとすぐに各メッシュに個別の頂点セットを与えますか?

于 2012-04-07T10:53:41.693 に答える