Perché la dimensione del pezzo spesso ha una potenza di due?


15

Esistono molti cloni di Minecraft e sto lavorando alla mia implementazione. Un principio di rendering del terreno è piastrellare il mondo intero in blocchi di dimensioni fisse per ridurre lo sforzo di cambiamenti localizzati.

In Minecraft la dimensione del blocco è di 16 x 16 x 256 per ora. E nei cloni ho sempre visto anche pezzi di una potenza del numero 2.

C'è qualche motivo per questo, forse legato alle prestazioni o alla memoria? So che i poteri di 2 svolgono un ruolo speciale nei computer binari, ma che cosa ha a che fare con la dimensione del blocco?


1
È bello poter continuare a dividerlo per due e ottenere numeri pari. (Non una risposta completa, ma qualcosa di utile sull'uso di un numero simile 2^n)
ashes999

Risposte:


27

Ciò dipende dal gioco e dalla struttura di indicizzazione utilizzata per i blocchi. Tuttavia, a un livello così elevato, non è molto probabile che abbia molto a che fare con la memoria o un miglioramento delle prestazioni specifico. Molto probabilmente è una decisione arbitraria per dimensionare i pezzi in modo prevedibile. Permette alcuni trucchi di conteggio e indicizzazione usando lo spostamento dei bit che non sarebbe possibile con numeri che non sono una potenza di due.

Ad esempio, contare in potenze di due è facile come spostare un po 'in binario:

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

L'utilizzo di queste scorciatoie dipenderà dallo sviluppatore e dal problema che stanno cercando di risolvere.

Se stai decidendo per quale dimensione realizzare i pezzi, e non importa in nessun altro aspetto, puoi anche usare qualcosa che è familiare e con i vantaggi che sei abituato a usare.


15

Innanzitutto, la moltiplicazione per potenze di due è molto più economica della moltiplicazione per un numero arbitrario, poiché puoi farlo spostando i bit . Il più delle volte il compilatore può fare questo per te, quindi ogni volta che scrivi "* 16" nel tuo codice, il compilatore fa effettivamente uno spostamento di quattro, e non devi preoccuparti di questo - devi solo dare il compilare l'opportunità progettando le strutture dei dati in questo modo.

In secondo luogo, poiché anche le linee della cache, i bus di memoria e le altre autostrade del computer tendono a essere progettate per utilizzare potenze di due, è possibile ottenere prestazioni complessivamente migliori in questo modo.

Terzo, noi vecchi geek siamo abituati a giocare con poteri di due, quindi è un'abitudine.

(In quarto luogo, anche altri vecchi fanatici del design che progettano il tuo hardware e i tuoi compilatori apprezzano i poteri di due, quindi questo non cambierà presto).


2
+1 "Terzo, noi vecchi geek siamo abituati a giocare con poteri di due, quindi è un'abitudine." Questo è probabilmente il motivo principale .
Laurent Couvidou,

9

La vera risposta è proprio questa: su un computer binario, i poteri di due sono buoni numeri rotondi.

Quando una persona normale ha bisogno di scegliere un numero arbitrario per qualche scopo, di solito scelgono dei bei numeri rotondi nel sistema numerico con cui sono a loro agio, base 10. Quindi sceglieranno 10, 100, 1000, ecc. Perché sono semplice e facile e non richiede molto pensiero e il valore preciso non era davvero importante per loro, stavano solo mirando a una scala generale di grandezza.

Come programmatori, quando abbiamo bisogno di scegliere un numero arbitrario per qualche scopo, di solito scegliamo dei bei numeri rotondi nell'uso dei computer del sistema numerico, base 2. Quindi sceglieremo 2, 4, 8, ecc. Perché sono semplici e facile e non richiede molto pensiero e il valore preciso non era davvero importante per noi, miravamo solo a una scala generale di grandezza.

Non è davvero più complicato di così. Sono solo dei bei numeri rotondi.


6

Un motivo non menzionato in altre risposte è che, se necessario, i poteri di due numeri possono sempre essere dimezzati senza problemi di arrotondamento. Questo probabilmente non è un motivo nei cloni di Minecraft, ma in alcuni altri casi come nelle trame con mipmap .


2

Un altro potenziale motivo potrebbe essere che ti consentirebbe di codificare le informazioni su ciascun blocco in una trama 3D. Se il tuo hardware di destinazione supporta trame 3D ma non ha un supporto per trame non power-of-two completamente robusto e generale (per il quale ammetto che vorresti sparare abbastanza in basso), allora rendere le tue dimensioni di blocchi di due potenze non è semplicemente l'ideale - è essenziale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.