チャンクサイズが2のべき乗であることが多いのはなぜですか?


15

そこには多くのMinecraftクローンがあり、私は自分の実装に取り​​組んでいます。テレインレンダリングの原則は、全世界を固定サイズのチャンクでタイリングして、ローカライズされた変更の労力を減らすことです。

Minecraftでは、現在のところ、チャンクサイズは16 x 16 x 256です。また、クローンでは、常に2のべき乗のチャンクサイズを見ました。

その理由はありますか、おそらくパフォーマンスやメモリに関連していますか?2のべき乗はバイナリコンピューターで特別な役割を果たすことを知っていますが、チャンクサイズとは何の関係がありますか?


1
それを2で割って、偶数を戻すことができてうれしいです。(完全な答えではありませんが、のような数字の使用に関して有用なものです2^n
-ashes999

回答:


27

これは、ゲームとチャンクに使用されるインデックス構造に依存します。ただし、このような高いレベルでは、メモリや特定のパフォーマンスの向上に大きく関係している可能性はあまりありません。チャンクのサイズを予測可能な方法で決定するのは、おそらく勝手な決定です。2の累乗ではない数値では不可能な、ビットシフトを使用したいくつかのカウントとインデックス作成のトリックが可能になります。

たとえば、2の累乗でカウントすることは、ビットをバイナリでシフトするのと同じくらい簡単です。

Dec =  Bin
1   =  000001
2   =  000010
4   =  000100
8   =  001000
16  =  010000
32  =  100000

これらのショートカットを使用する場所は、開発者と解決しようとしている問題によって異なります。

チャンクを作成するサイズを決定する際に、他の面では重要ではない場合は、使い慣れたもので使い慣れているものを使用することもできます。


15

まず、2のべき乗で乗算することは、ビットシフトで実行できるため、任意の数で乗算するよりもはるかに安価です。ほとんどの場合、コンパイラーがこれを行うことができるため、コードに「* 16」を書き込むたびに、コンパイラーは実際に4シフトし、心配する必要はありません。このようにデータ構造を設計することにより、機会をコンパイラします。

次に、コンピューターのキャッシュライン、メモリバス、その他の情報ハイウェイも2のべき乗を使用するように設計される傾向があるため、この方法で全体的にパフォーマンスが向上する可能性があります。

第三に、私たちの古いオタクは2のべき乗で遊んでいるだけなので、それは習慣です。

(第4に、ハードウェアとコンパイラを設計する他の古いオタクも2のべき乗が好きなので、これはすぐには変わりません)。


2
+1「3番目、私たちの古いオタクは2のべき乗で遊ぶことに慣れているので、それは習慣です。」これがおそらく主な理由です。
ローランクーヴィドゥー

9

本当の答えはこれだけです:バイナリコンピューターでは、2のべき乗はいいラウンド数です。

普通の人が何らかの目的で任意の数字を選ぶ必要があるとき、彼らは通常、彼らが快適な番号体系で素敵なラウンド番号を選択します。10を基数とします。シンプルで簡単であり、多くの思考を必要とせず、正確な値は彼らにとってそれほど重要ではありませんでした。

プログラマーとして、何らかの目的で任意の数字を選択する必要がある場合、通常、コンピューターが使用する数字システムの基数2で適切なラウンド数を選択します。したがって、2、4、8などを選択します。簡単であり、多くの思考を必要とせず、正確な値は私たちにとってそれほど重要ではありませんでした。

それは本当にそれ以上複雑ではありません。彼らはちょうどいいラウンド数です。


6

他の回答で言及されていない理由の1つは、必要に応じて、丸めの問題を発生させることなく、2つの数値のべき乗を常に半分にできることです。これはおそらくMinecraftクローンでは理由ではありませんが、mipmaps使用したテクスチャーなど、他のいくつかのケースではそうです。


2

もう1つの潜在的な理由は、3Dテクスチャの各チャンクに関する情報をエンコードできるようになることです。ターゲットハードウェアが3Dテクスチャをサポートしているが、完全に堅牢で一般的な2のべき乗でないテクスチャサポートがない場合(かなり低く撮影したいことを認めます)、チャンクサイズを2のべき乗にすることはできません理想的です-それは不可欠です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.