タグ付けされた質問 「resource-management」

4
C ++ゲームはメモリ割り当てエラーをどのように処理しますか?
私はC ++で書かれているが例外を使用しないいくつかのゲームを知っています。C ++でのメモリ割り当てエラーの処理は一般にstd::bad_alloc例外を中心に構築されているため、これらのゲームはどのようにそのようなエラーを処理しますか? それらは単にクラッシュしますか、またはメモリ不足エラーを処理して回復する別の方法がありますか?

1
拡張可能なアセット読み込みシステムをどのように構築すればよいですか?
Javaの趣味のゲームエンジンの場合、シンプルだが柔軟なアセット/リソースマネージャーをコーディングしたいと思います。資産は、音、画像、アニメーション、モデル、テクスチャなどです。数時間のブラウジングといくつかのコードの実験の後、私はまだこのことを設計する方法がわかりません。 具体的には、特定の資産タイプがどのようにロードされ、どこから資産がロードされるかを抽象化するような方法でマネージャーを設計する方法を探しています。他のプログラムがそれについて知る必要なしに、ファイルシステムとRDBMSストレージの両方をサポートできるようにしたいと思います。同様に、XMLであるアニメーション記述アセット(FPS、レンダリングするフレーム、スプライトイメージへの参照など)を追加したいと思います。XMLファイルを見つけて読み取り、AnimationAssetその情報を持つクラスを作成して返す機能を備えたクラスを作成できるはずです。データ駆動型の設計を探しています。 私は上の多くの情報を見つけることができますどのような資産運用会社がすべきではなく、上でどのようにそれを行います。関連するジェネリックは、何らかの形のクラスのカスケード、または何らかの形のヘルパークラスをもたらすようです。しかし、個人的なハックやコンセンサスのように見えない明確な例を見たことはありません。

2
「ResourceManager」クラスが不良と見なされる場合、代替手段は何ですか?
次のような相反する意見を聞いています。 「専任のマネージャークラスはほとんど適切なエンジニアリングツールではありません」 「専用マネージャークラスは(現在)何千ものリソースを持つ大規模プロジェクトを生き残るための最良の方法です」 次の機能を持つ従来のResourceManagerクラスを見てみましょう。 アセット(テクスチャ、オーディオ、3Dモデルなど)をロードします キャッシュを保持することにより、アセットが一度だけロードされるようにします 参照は、資産を割り当て解除できるかどうかを判断するために資産をカウントします 実際の資産の出所を隠します(たとえば、資産ごとに1つのファイル、1つのパッケージファイル内のすべての資産、またはネットワークを介して資産をロードすることもできます) プログラムを再起動せずにアセットをリロードできます。これは、ゲームに取り組んでいるアーティストにとって非常に便利です。 また、これらのResourceManagerオブジェクトがシングルトンではなく、依存性注入を介して渡されるように見せることにより、テーブルから「シングルトンは悪い」引数を取りましょう。 次に、「ファクトリを使用する」または「ファクトリと呼ぶ」引数があります。これに関する私の問題は、はい、それはファクトリーですが、キャッシュとリローダーでもあるということです(より良い言葉がないため)。それをファクトリと呼ぶことはそれを適切に記述しません、そして私がそれを適切なファクトリにするならば、キャッシングとリロードはどこで実装されますか? 「マネージャー」クラスはしばしば悪いアーキテクチャの症状であることに同意しますが、この特定のケースでは、どのように再構築し、すべての機能を保持できますか?これは、「Manager」クラスが実際に適切な状況ですか?

1
ゲームエンジンの設計-Ubershader-シェーダー管理設計[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 2年前に閉店しました。 遅延シェーディングを備えた柔軟なUbershaderシステムを実装したい。私の現在のアイデアは、FlatTexture、BumpTexture、Displacement Mappingなどの特定の機能を処理するモジュールからシェーダーを作成することです。色をデコードしたり、トーンマッピングなどを行う小さなモジュールもあります。これには、 GPUがサポートしていない場合、特定のタイプのモジュールを交換します。そのため、現在のGPU機能に適応できます。このデザインが良いかどうかはわかりません。私は今、悪いデザインを選択し、後でそれを支払うことができるのではないかと恐れています。 私の質問は、シェーダー管理システムを効果的に実装する方法に関するリソース、例、記事はどこにありますか?ビッグゲームエンジンがこれを行う方法を知っている人はいますか?

1
ResourceManagerクラスの設計
趣味のゲームエンジン用に中央のResourceManager / ResourceCacheクラスを作成することにしましたが、キャッシュスキームの設計に問題があります。 ResourceManagerには、ゲームのすべてのリソースを組み合わせて使用​​される合計メモリのソフトターゲットがあります。他のクラスは、リソースオブジェクトを作成します。リソースオブジェクトはアンロード状態になり、ResourceManagerに渡します。次にResourceManagerは、ソフト制限を念頭に置いて、特定のリソースをいつロード/アンロードするかを決定します。 別のクラスがリソースを必要とする場合、そのリクエストはResourceManagerに送信されます(文字列IDまたは一意の識別子を使用)。リソースがロードされると、リソースへの読み取り専用の参照が呼び出し元の関数に渡されます(参照カウントされたweak_ptrにラップされます)。リソースがロードされていない場合、マネージャーは次の機会(通常はフレームの描画の最後)にロードするオブジェクトをマークします。 私のシステムはいくつかの参照カウントを行いますが、リソースが読み取られているときにのみカウントします(したがって、参照カウントは0かもしれませんが、エンティティはまだそのuidを追跡している可能性があります)。 初めて使用する前にリソースをロード用にマークすることもできます。以下は、私が使用しているクラスのスケッチです。 typedef unsigned int ResourceId; // Resource is an abstract data type. class Resource { Resource(); virtual ~Resource(); virtual bool load() = 0; virtual bool unload() = 0; virtual size_t getSize() = 0; // Used in determining how much memory is // being used. …

2
不足しているリソースをどのように処理すればよいですか?
ゲームは特定のアセットがロードされることを期待していますが、見つかりません。状況はどのように処理する必要がありますか?例えば: Texture* grassTexture = LoadTexture("Grass.png"); // returns NULL; texture not found Mesh* car = LoadMesh("Car.obj"); // returns NULL; 3D mesh not found 開発中にユーザーが誤って削除したり、破損したり、スペルを間違えた可能性があります。 いくつかの潜在的な応答: アサーション(理想的には開発中のみ) ゲームを正常に終了します 例外をスローして、それを処理しようとします。 どちらが最適ですか?

3
アセットにカスタムメモリ管理が必要なのはなぜですか?
ゲームプログラミングに関連するほとんどすべてのリソース、特に3Dオープンワールドゲームでは、ディスク、システムメモリ、ビデオメモリとの間でアセットを常にアンロードおよびリロードする必要がある方法について説明しています。コンソールには、オーバーフローの可能性に対処できない非常に単純なメモリ管理スキームがあるため、これを理解できます。 ただし、PCでは状況が大きく異なります。システムメモリ用にOSによって提供される仮想メモリがあり、グラフィックドライバがCPUからGPUへのスワッピングを処理します。それでは、一度にすべてをロードするだけでは不十分であり、プリフェッチのみを処理し、必要なアセットがスワップされている間はブロックされないようにする必要があるのはなぜですか? これは、すべてがのように単純に割り当てられていると言っているのではありませんmalloc。すべてが隣接し、キャッシュ一貫性が保たれます。とにかく手動でページを出し入れすることを心配する必要がない場合は、メモリアクセスを効率的にする方が間違いなく簡単です... 更新: 非同期バッファー転送に少し読み込んだ後、グラフィックスドライバーが自動的にメモリをページインおよびページアウトする方法が最適ではないことがわかりました。これはCPUリソースにも当てはまりますか。つまり、仮想メモリが存在する場合でも、特定のリソースをいつロードおよびアンロードするかを常に手動で管理する方が良いでしょうか。

5
シーンに追加せずに新しいGameObjectを作成する方法は?
私は本質的に自分のプレハブシステムを作成しています。ゲームオブジェクトは、人間が読めるデータファイルによって定義されます。空のゲームオブジェクトを作成し、データファイルで定義されたコンポーネントを使用してロードし、準備してInstantiate()呼び出しを待機したいと思います。ただし、使用GameObject go = new GameObject()するたびに新しいゲームオブジェクトがシーンに追加されます。 Unityに組み込まれたプレハブを使用して、プレハブをGameObjectとしてロードできますが、シーンに追加されません。(下の例を参照) この背後にある理論的根拠は、Unityプレハブをロードすることによって生成されたものと、カスタムプレハブシステムによって作成されたものと、GameObjectsを含む1つのリストが欲しいということです。これは実行時に行う必要があり、Unity Editorを使用することはできません(理想的にはエンドユーザーが独自のデータファイルを定義できるためです)。 Unityが自動的にインスタンス化しないで、新しいGameObjectを作成するにはどうすればよいですか? たとえば、次のように電話をかけることができます。 Resources.LoadAll("PrefabsDirectory", typeof(GameObject)) また、呼び出しが行われたときにシーンに追加されていないGameObjectsのリストを取得します。基本的に、私はLoadAll自分のプレハブ用のメソッドを作成しています。同様に、呼び出しが行われたときにGameObjectsをインスタンス化したくありません。

1
HTML5ゲーム用のリソースマネージャーが必要ですか?
通常、デスクトップ/モバイルゲームにはリソースマネージャーが必要です。しかし、HTML5(ブラウザ)ゲームには必要ですか? リソースマネージャーの主な役割は、メモリ内にリソースのクローンがないことを確認することです。しかしブラウザでは、何かをリクエストすると、リクエストは通常​​キャッシュされます。したがって、同じリソースに対して別のリクエストを行うと、リソースは読み込まれなくなります。あなたはすぐにそれを得ます。(CMIIW)。 では、html5ブラウザーゲーム用のリソースマネージャーが必要ですか? ありがとう。

4
XNAでゲームリソースをどのように管理しますか?
昔はあちこちで使っContent.Load<type>("filename");てきました。これはすぐに管理の悪夢になり、さらに悪いことに、同じアセットの複数のコピーを複数の異なる場所にロードし始めます。 次に、基本的に次のようなResourcesクラスの使用に移りました。 public class Resources { public static Texture2D particle01; ... public static Texture2D particle93; public static Effect shader01; ... public static Effect shader32; public static Load(ContentManager content, GraphicsDevice device) { //load all the resources } public static Unload() { //unload all the resources } } 次にResources.particle01、同じ名前空間内のどこからでもリソースへの参照を取得するために単に使用できます。 これは、私が過去に持っていた重複を排除したので、素晴らしいアプローチでした。また、すべてのロードは単一のクラスで行われたため、リソースを追跡するのは簡単でした。最後に、たとえば右クリックして、particle93[すべての参照を検索]をクリックして、そのテクスチャを使用したすべての場所を見つけることができます。 しかし、このアプローチには問題があり、より良い解決策があるかどうか知りたいです。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.