¿Por qué el tamaño del fragmento a menudo es una potencia de dos?


15

Hay muchos clones de Minecraft y estoy trabajando en mi propia implementación. Un principio del renderizado del terreno es el mosaico del mundo entero en trozos de tamaño fijo para reducir el esfuerzo de los cambios localizados.

En Minecraft, el tamaño del fragmento es de 16 x 16 x 256 hasta ahora. Y en clones también siempre vi trozos de una potencia del número 2.

¿Hay alguna razón para eso, tal vez el rendimiento o la memoria relacionada? Sé que los poderes de 2 juegan un papel especial en las computadoras binarias, pero ¿qué tiene eso que ver con el tamaño del fragmento?


1
Es bueno que puedas seguir dividiéndolo por dos y recuperar números pares. (No es una respuesta completa, pero algo útil sobre el uso de un número como 2^n)
cenizas999

Respuestas:


27

Esto dependería del juego y la estructura de indexación utilizada para los fragmentos. Sin embargo, a un nivel tan alto, no es muy probable que tenga mucho que ver con la memoria o una mejora específica del rendimiento. Es más que probable que sea una decisión arbitraria para dimensionar trozos de una manera predecible. Permite algunos trucos de conteo e indexación utilizando el desplazamiento de bits que no sería posible con números que no son una potencia de dos.

Por ejemplo, contar en potencias de dos es tan fácil como cambiar un poco en binario:

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

El lugar donde se utilizarán estos accesos directos dependerá del desarrollador y del problema que estén tratando de resolver.

Si está tomando una decisión sobre qué tamaño hacer los trozos, y no importa en ningún otro aspecto, también puede usar algo que le sea familiar y que tenga los beneficios que está acostumbrado a usar.


15

Primero, multiplicar por potencias de dos es mucho más barato que multiplicar por un número arbitrario, ya que puedes hacerlo cambiando un poco . La mayoría de las veces el compilador puede hacer esto por usted, por lo que cada vez que escribe "* 16" en su código, el compilador en realidad hace un cambio de cuatro, y no necesita preocuparse por eso, solo tiene que dar el compile la oportunidad diseñando sus estructuras de datos de esta manera.

En segundo lugar, dado que las líneas de caché, los buses de memoria y otras autopistas de información en su computadora también tienden a estar diseñadas para usar potencias de dos, puede obtener un mejor rendimiento general de esta manera.

Tercero, los viejos geeks estamos acostumbrados a jugar con poderes de dos, por lo que es un hábito.

(Cuarto, a otros viejos geeks que diseñan su hardware y sus compiladores también les gustan los poderes de dos, por lo que esto no va a cambiar en el corto plazo).


2
+1 "Tercero, los viejos geeks estamos acostumbrados a jugar con poderes de dos, así que es un hábito". Esta es probablemente la razón principal .
Laurent Couvidou

9

La verdadera respuesta es esta: en una computadora binaria, las potencias de dos son buenos números redondos.

Cuando una persona normal necesita elegir un número arbitrario para algún propósito, generalmente elige buenos números redondos en el sistema de números con el que se siente cómoda, base 10. Entonces elegirán 10, 100, 1000, etc. Porque son simple y fácil y no requiere mucho pensamiento y el valor preciso no era realmente importante para ellos, solo apuntaban a una escala general de magnitud.

Como programadores, cuando necesitamos elegir un número arbitrario para algún propósito, generalmente elegimos números redondos agradables en el sistema de números que usan las computadoras, base 2. Así que elegiremos 2, 4, 8, etc. Porque son simples y fácil y no requiere mucho pensamiento y el valor preciso no era realmente importante para nosotros, solo estábamos apuntando a una escala general de magnitud.

Realmente no es más complicado que eso. Son solo buenos números redondos.


6

Una razón que no se menciona en otras respuestas es que, si es necesario, las potencias de dos números siempre se pueden reducir a la mitad sin problemas de redondeo. Probablemente esta no sea una razón en los clones de Minecraft, pero en algunos otros casos, como en las texturas con mipmaps .


2

Otra posible razón sería que le permitiría codificar información sobre cada fragmento en una textura 3D. Si su hardware de destino admitía texturas 3D pero no tenía un soporte de textura totalmente robusto y general sin potencia de dos (que admito que le gustaría disparar bastante bajo), entonces hacer que sus pedazos no sean potencias de dos no es simplemente ideal, es esencial.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.