タグ付けされた質問 「memory-efficiency」

情報を整理して保存し、メモリを最大限に活用しながら、可能な限り少量のメモリを使用する方法。

6
2,000万タイルのマップでゲームのメモリが不足します。どうすれば回避できますか?
余分な巨大なマップをロードしているときに、ロードメソッドがメモリ例外をスローし、マップタイルの新しいインスタンスが作成されます。少なくともサーバーアプリ(および可能であればクライアント)でマップ全体を処理してもらいたいのですが。この問題を解決するにはどうすればよいですか? UPD:ここでの問題は、使用する空きメモリがまだあるときにゲームがクラッシュしないようにする方法です。チャンクでマップを分割することに関しては、それは良いアプローチですが、私の場合には望みのものではありません。 UPD2:最初に私は行って、タイルクラスのすべての新しいインスタンスにテクスチャを割り当てました。今では、約4分の1のスペースで済みます。皆さんのおかげで、今はまだ塊に分割することを考えずに巨大なマップを実行できます。 UPD3:コードを書き直して、タイルプロパティの配列がより速く機能するか、メモリ消費が少ないかどうかを確認した後(オブジェクトプロパティとしての各タイルのプロパティよりも)、それを試すのに多くの時間がかかっただけでなく、パフォーマンスは向上せず、ゲームのデバッグが非常に困難になりました。

1
同じビットサイズのレンダーターゲットが重要なのはなぜですか?
現在、遅延シェーディングに必要なGBufferのタイプを考えているので、最も一般的なものとそのフォーマットについてオンラインでドキュメント化しようとしました。 私が見たほとんどのGBufferは、各レンダーターゲットに同じビットサイズを使用しており、多くの場合、未使用のチャネルにもつながります。しかし、私のGBufferの最初の推測として、紙の上では、2つの24ビットターゲットと2つの32ターゲット、または3つの24と1 32が必要です。 各添付ファイルを同じ「サイズ」にするとより適切に位置合わせできることを理解していますが、実際には、チャネルを無駄にして(または将来の使用のために予約して)すべてのRTを同じサイズにするか、必要なものだけを使用する方が良いですか?前者の場合、なぜそのような利点があるのか​​、とにかく24ビットのものは32にパディングされるのでしょうか?

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


2
大きなタイルマップ上のエリアとダンジョンを「ゾーニング」
私のゲームは、疑似無限でランダムに生成される方法で、Minecraftのようなマップを持っています。そして大きい。ユーザーが1000x1000ゾーン(ここでは2D)を探索したとすると、1,000,000タイルになります。 もちろん、すべてをメモリに保存することはできません。また、10タイルまたはすべての半径からすべてを無視したくありません。どちらも更新されず(すべてのNPC、おそらくリアクティブタイル)、1382、12918のような厄介な位置で作業する必要があります。 したがって、チャンクやゾーン、または64x64タイルなどに分割する場合、各タイルとオブジェクトの位置を次のように保存する必要があります。 チャンクa、b。位置x、y。 しかし、マップにダンジョンなどが必要な場合はどうなりますか?つまり、それぞれが40x40の面積を持つ40階のダンジョンにつながる単一のタイルです。それらを同じマップに正確に格納することはできません。 そして、記憶の側面があります。どのくらいの量を同時に合理的に同時にメモリに格納できますか?IDでタイルを簡単に作成でき、そこに通常の2D配列を配置できます。または、タイルタイプのデータファイルよりも効果的な解決策はありますか?したがって、64x64の場合は、20K程度になるでしょう。最も現実的な更新のために、できるだけ多くの環境が読み込まれるようにしたいと思います。しかし、私は、メモリの浪費になることなく、どのような制限に達することができるのかわかりません。

1
16×16ピクセルのタイルがそれほど一般的であるのはなぜですか?
タイル(Minecraftなど)が16×16になる理由はありますか? 16はバイナリなので、バイナリと関係があるように感じますが、それは10000偶然かもしれません。 知りたいのは、地形生成を使ってゲームを作りたいからです。タイルの大きさ、またはそれが本当に重要かどうかを知りたいのです。

2
変換階層を表すための効率的な構造
たとえば階層モデルで、行列のツリーを表すメモリ効率の良い方法を誰かが提案できますか? 特に、データの局所性を維持することに熱心であり、配列構造(行列&行列のインデックス)タイプのアプローチが適しているのではないかと思います。 多くの連鎖行列計算と同様に、この構造はおそらくメモリ内でかなりコピーされるため、連続したストレージを持つことは大きなボーナスになります。

1
モバイルゲームを作成するときに浮動小数点数または倍精度浮動小数点数を使用する
シェーダーの場合、フロートはパフォーマンスにとって最適な選択肢であるため、フロートを使用する必要があります。ダブルスは遅く、より多くのメモリを使用するため、シェーダーには理想的ではありません。フロートは精度が低く、フロートオーバーフローになる傾向がありますが、速度のトレードオフはモバイルハードウェアで理想的です。 しかし、シェーダーパイプラインに関連しないコードベースの他の場所についてはどうでしょうか。私はエンジンを作成していて、デルタ更新ティックにdoubleを使用し、すべてのユニットをそのデータ型に相対的に保つようにして、doubleを使用する場所がたくさんあるようにします。エンジンのモバイルでもフロートを使用する必要がありますか? エンジンはC ++言語で記述されています

2
iOSに最適なメモリ割り当て戦略は?
iOSでのメモリ割り当てについて私は議論しています。ほとんどのコードをC ++で記述していて、ObjectPools、FreeListsなどを使用するのが本当に好きです。ゲームの進行中に常に「割り当て/割り当て解除」する多くのものを事前に割り当てるために、パーティクル、ゲームエンティティなど)。 それでもiOSでは、PSPのようなコンソール向けに開発しているようなものではありません。PSPのように、一定量のメモリが確保されることは事実です。iOSは、システムがメモリを必要とするときに「メモリ警告」を発行します。 誰かこれについていくつかの提案がありますか?新しいiPod touch / iPhone 4はより多くのRAMを搭載しているので、深刻すぎますか?それともそれは大きな懸念ですか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.