为什么块大小通常是2的幂?


15

我的世界有很多Minecraft克隆版本,我正在着手自己的实现。地形渲染的原理是将整个世界分成固定大小的块,以减少局部更改的工作量。

到目前为止,在Minecraft中,块大小为16 x 16 x 256。在克隆中,我也总是看到块大小为2的幂。

是否有任何原因,可能与性能或内存有关?我知道2的幂在二进制计算机中起特殊作用,但与块大小有什么关系?


1
您可以将其始终除以2并得到偶数,这是很好的。(这不是一个完整的答案,但是对于使用类似的数字会有所帮助2^n
ashes999 2013年

Answers:


27

这将取决于游戏和用于块的索引结构。尽管在如此高的水平上,它不太可能与内存或特定的性能增强有很大关系。以可预测的方式调整块大小很可能是一个任意决定。它允许使用移位来进行一些计数和索引操作,而对于数字不是2的幂的数字,这是不可能的。

例如,以2的幂进行计数就像二进制移位一样容易:

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

这些快捷方式将在何处使用取决于开发人员以及他们要解决的问题。

如果您要决定制作块的大小,而在其他任何方面都没有关系,则最好使用熟悉的东西并从中受益。


15

首先,乘以2的幂比乘以任意数便宜得多,因为您可以通过移位来实现。大多数情况下,编译器可以为您执行此操作,因此,每当您在代码中写入“ * 16”时,编译器实际上就会进行四次移位,而您不必担心它-您只需要给通过这种方式设计数据结构,可以为编译人员提供机会。

其次,由于计算机中的高速缓存线,内存总线和其他信息通道也往往被设计为使用2的幂,因此以这种方式总体上可能会获得更好的性能。

第三,我们这些老怪胎只是习惯于玩二的幂,所以这是一个习惯。

(第四,其他设计硬件和编译器的老极客也喜欢2的幂,因此这不会很快改变)。


2
+1“第三,我们这些老怪胎只是习惯于玩2的幂,所以这是一种习惯。” 这可能是最主要的原因。
Laurent Couvidou

9

真正的答案是这样的:在二进制计算机上,2的幂是整数。

当普通人出于某种目的需要选择任意数字时,通常会在自己喜欢的数字系统中以10为底数选择不错的整数。因此,他们会选择10、100、1000等。简单易用,不需要太多的思考,准确的价值对他们并不真正重要,他们只是针对总体规模。

作为程序员,当我们出于某种目的需要选择任意数字时,通常会在系统计算机使用的数字(以2为底)中选择合适的整数。因此,我们将选择2、4、8等。因为它们很简单,并且容易,不需要太多的思考,精确的值对我们来说并不重要,我们只是针对总体规模。

其实没有什么比这更复杂的了。它们只是不错的整数。


6

在其他答案中未提及的原因之一是,如果需要,可以始终将两个数的幂减半而不会出现舍入问题。这可能不是Minecraft克隆中的原因,但在其他情况下(例如,带有mipmaps的纹理中)则是原因。


2

另一个潜在的原因是,它将允许您对3D纹理中每个块的信息进行编码。如果您的目标硬件支持3D纹理,但不具有完全健壮的和一般的非二次幂纹理支持(我承认您希望对此进行较低的拍摄),那么使块大小为2的幂不是只是理想-这是必不可少的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.