2012-03-02 7 views
2

オブジェクトが3D配列に格納されている3Dゲームがあります。すべてのオブジェクトは、比較的大きなサイズ(正確には数メガバイト、4,194,304バイト)のstructです。ポインタの配列と生の値の配列:パフォーマンスとメモリ

生の値の配列として格納した場合:gameObject objects[64][64][8]、それらはすべて1か所に格納されますが、オブジェクトが使用されているかどうかにかかわらず、すべてのオブジェクトが割り当てられます。
Iは、ポインタの配列として、配列を割り当てる場合は、:gameObject *objects[64][64][8]、(アレイ全体の半分以上であってもよい)、未使用のオブジェクトは、それらが必要になるまでメモリへの影響を低減する、割り当てられないであろうが、なぜならより遅いかもしれませんオブジェクトは、最善のアプローチである、すべてのパフォーマンスとメモリ使用量の間のトレードオフを考慮すると、メモリ

を超えていますか?私の懸念は有効ですか?

+1

「数バイト」はいくらですか?ポインタはx86_64上で8バイトですが、これは私もいくつかあると考えています – hirschhornsalz

+0

申し訳ありませんが、私は自分のコードの間違った部分を見ていることに気づきました;)。それはもっと__million__バイトのようになります。 – Greg

+3

"パフォーマンスとメモリ使用の間のトレードオフを考慮して"あなたが行うことは、測定するまで無関係です。 – pmg

答えて

5

オブジェクトは全てメモリ上にあるので、[第二のアプローチは】遅いかもしれない

すべてのオブジェクトのサイズが4メガバイトであるので、異なるオブジェクト間で参照の局所性は、ほぼ確実に問題ではありません。 2つめの方法を試してみてください。

私たちに与えられた数字が正しいならば、128x128x128の4MBオブジェクトの配列は約8TBのRAMを必要とします。そのため、最初のアプローチは典型的なハードウェアでは実行できません。 ;-)

+0

参照の場所だけではありません。逆参照ポインターにはレイテンシコストもあります。 – zmccord

1

あなたよりパフォーマンスのオプションは、あなたが持っている要素の正確な数にサイズを変更し、値の配列として保存することができますので、動的に割り当てられた配列を使用することです。それが疎な場合を除き、間接指定を使用することに同意します。あなたのコメントの後

0

は、あなただけのRAMの500メガバイトを(あなたの質問は今、RAMの128ギガバイトを述べて...)必要があると言って、それは両方が生きているように、2つのオプションを比較することが可能です。

あなたが唯一のものは、各オブジェクトの最初の数バイトにアクセスしない限り、あなたは本当にそれらを動的に割り当てることによって何かを失うつもりはありません。第1のアプローチが第2のアプローチよりもはるかに高速であるためには、非常に珍しい使用パターンが必要です。

あなたはそれらのオブジェクトにアクセスする方法を知っているだけですので、あなたはおそらく、各オプションを測定する必要がありますし、最初は確かに高速であるかどうかを確認します。