Che tipo di hardware sarebbe necessario per rendere una minecraft di dimensioni terrestri come una mappa?


10

Ho pensato a questo problema. Con la tecnologia attuale è possibile creare una replica 1: 1 della terra in un gioco basato su voxel? Qual è la migliore struttura di dati per memorizzare questa gigantesca mappa? Quale algoritmo dovrebbe essere usato per rendere questa struttura di dati in tempo reale?

Queste domande fanno queste ipotesi:

  • Ogni voxel ha una risoluzione di 1 metro cubo.

  • Per semplicità, ogni voxel richiede solo 1 byte di informazioni sui metadati. Queste informazioni verranno utilizzate per memorizzare l'identificativo del "tipo" di voxel (terra, acqua, roccia, ecc.).

  • Il volume della terra è 1 * 10ˆ21 metri cubi.

  • Per "tecnologia attuale" includo tutto ciò che è disponibile in commercio, ma non i supercomputer.

  • Solo la topografia e la batimetria terrestre verranno utilizzate per generare la mappa. Sono esclusi edifici umani, piante o grotte. I blocchi sotterranei saranno scelti sulla base di studi geologici, ad esempio: se la profondità è maggiore di 3000 km, rendere un voxel 'magma'.

  • Proprio come in Minecraft, la mappa non è statica, può essere modificata nel gioco.

  • Una distanza di attrazione "infinita" è un grande vantaggio, qual è il punto di avere l'intera terra in una mappa se non puoi volare su e guardare l'intero pianeta?

La prima conclusione che sono arrivato quando ho pensato a questo problema è che la memorizzazione dei dati della Terra in modo lineare è impossibile, supponendo che ogni voxel occupi solo 1 byte di memoria, ciò richiederebbe comunque 1 zettabyte per memorizzare la mappa. Quindi è richiesto un qualche tipo di compressione.

Penso che un octree di voxel possa comprimere la mappa, ma non sono sicuro di quanto. L'entropia di questa mappa voxel è probabilmente molto bassa, quindi immagino che si possa raggiungere un livello molto alto di compressione.

disconoscimento

Questa è una domanda teorica, non ho intenzione di scrivere una terra voxel

MODIFICARE

L'ESA GOCE ha già mappato il geoide terrestre con una precisione di 1 cm-2 cm. Credo che queste informazioni possano essere utilizzate per generare una mappa altimetrica molto precisa della Terra. Ciò escluderebbe la necessità di utilizzare un algoritmo per colmare le lacune nella topografia terrestre.


1
Per quello che vale i mondi in Minecraft sono più grandi della terra, quello che stai davvero cercando di ottenere è una mappa voxel multi-risoluzione della terra in modo che tu possa vederli tutti in una volta invece del raggio di visione limitato trovato all'interno quel gioco. Questo si riduce davvero a un livello di dettaglio. Quando mostri i singoli voxel o quando tutti questi voxel vengono calcolati come media in un blocco e renderizzati come un singolo punto nella mappa a bassa risoluzione. Come si scala rapidamente tra i livelli di dettaglio, ecc.
James

@James, dimentichi che Minecraft è generato proceduralmente, il che significa che non è necessaria alcuna memoria / archiviazione dei dati fino a quando non visiti effettivamente un'area. Vuole avere la nostra terra, il che significa che avrai bisogno di dati per l'intero pianeta, fino alla dimensione del metro cubo.
William Mariager,

1
"questo richiederebbe ancora 1 zettabyte per memorizzare la mappa. Quindi è richiesto un qualche tipo di compressione." Non so perché, ma questo mi ha fatto sorridere :) potresti anche essere interessato a tenere d'occhio infinity-universe.com/Infinity
Ray Dey,

@RayDey Grazie per il link, il loro video di anteprima è impressionante! infinity-universe.com/Infinity/…
Cesar Canassa il

Dipende. Sul mio monitor un modello di replica 1: 1 della Terra con voxel da 1m sarebbe in grado di riprodurre solo una frazione di voxel alla volta ...
Peter Taylor,

Risposte:


6

Ciò dipende dal metodo di suddivisione spaziale che si utilizza, sebbene tutti i metodi di suddivisione (come qualsiasi metodo di compressione) finiscano per eseguire il pan in cui non può avvenire alcuna ulteriore compressione, a causa delle spese generali della struttura dei dati e di altri fattori logici / matematici. Un esempio può essere trovato in octrees. Per ciascun nodo nell'ottobre, è necessario mantenere un puntatore al suo genitore e / o figli (a seconda di come si procede nell'architettura della struttura dei dati), per consentire un attraversamento significativo. Qualsiasi struttura ad albero può contenere n bambini. Più basso è il rapporto 1: n, più efficiente sarà lo spazio che guadagni e, di conseguenza, maggiori saranno le spese generali nel passaggio degli alberi poiché devi avere più nodi antenati per contenere lo stesso numero di voxel delle foglie (nel tuo caso, circa 510 trilioni di questi rappresentano l'area).

Considerando che nel tuo caso i problemi principali sono i costi di archiviazione e il rendering dell'intero pianeta (o parti di esso) da una discreta distanza, non esiste una struttura di dati che consiglierei su un octree. Il mipmapping è una necessità: 12,8 milioni di metri di diametro alla potenza più vicina di 2 è 2 ^ 24 = 16,8 milioni. 24 livelli di ottetto da attraversare equivarrebbero a una quantità enorme di ramificazioni - molto costosa per GPU e CPU. Ma purché tu faccia le cose nel modo giusto, dovrai attraversare solo pochi livelli alla volta. Data la quantità di spazio richiesto, tuttavia, le alternative sono poche e lontane tra loro (vedi sotto).

Le capacità di mipmapping di ocre sono ciò che lo rende uno strumento incredibilmente potente per grandi volumi come quello che descrivi. A differenza di tutti gli altri metodi di suddivisione noti (ad eccezione degli alberi KD), l'octree mantiene la suddivisione per livello minimo, il che significa che anche le differenze visive e fisiche tra i livelli di mipmap sono minime, il che significa delta molto più fini nella granularità mentre cammini e giù per l'albero.

Se, d'altra parte, vuoi generare un mondo in cui l'attraversamento gerarchico della griglia è ridotto al minimo, dovrai scambiare spazio per aumentare la velocità.

Parlando del rapporto ideale 1: n, non esiste una struttura più fine dell'albero kd in questo senso. Laddove l'ottico si divide in 2 per ciascun asse, risultando in 2 ^ 3 = 8 singole celle figlio, l'albero kd si divide esattamente una volta per livello di suddivisione. Il problema è che devi scegliere un iperpiano da dividere, e questo iperpiano potrebbe essere scelto attorno a uno dei 3 assi. Sebbene sia ottimale in termini di spazio, rende gli attraversamenti 3D (come durante i raymarches, un'opzione fondamentale quando si usano gli oculari per la fisica o il rendering) molto più difficile rispetto a un octree, dal momento che una struttura di tipo portale dinamico deve essere mantenuta per registrare interfacce tra singoli nodi kd-tree.

RLE è un altro approccio alla compressione, ma è per molti versi più difficile da applicare a un problema come questo (in cui la base delle operazioni è sferica), poiché la compressione RLE è unidimensionale ed è necessario selezionare l'asse in cui opera. pianeta, si potrebbe scegliere l'asse polare, ma qualsiasi scelta a singolo asse introdurrebbe alcuni problemi con gli attraversamenti per il rendering e la fisica quando si agisce da determinati angoli non ottimali. Naturalmente, potresti anche eseguire RLE su 3 assi contemporaneamente, triplicando il costo di archiviazione o su 6 assi (-x, + x, -y, + y, -z, + z) come ulteriore ottimizzazione.

Quindi, per rispondere alla tua domanda (o no!)

Non ho intenzione di rispondere direttamente a quale tipo di hardware, ma penso che osservarlo da una prospettiva a otto inizia a darti un'idea di cosa sia effettivamente possibile su quale tipo di hardware. Ti incoraggio a percorrere questa strada, se vuoi davvero saperlo, potrebbe essere più semplice implementare effettivamente un semplice ottetto sparso(vedi la carta di Laine tra i riferimenti) e posiziona un guscio sferico di voxel di superficie, e vedi com'è l'utilizzo dello spazio risultante. Fai un passo avanti da lì. Guarda quanto lontano puoi arrivare prima che la memoria del tuo sistema inizi a cedere. Ciò non richiede di scrivere un renderer a meno che non si desideri visualizzare. Ricorda anche che è meglio farlo sulla CPU: le GPU in generale non hanno la capacità di memoria per affrontare i problemi di questa scala. Questo è uno dei motivi per cui Intel sta cercando di passare a processori estremamente paralleli: i vantaggi di GPGPU, che è meglio in questo genere di cose, possono essere applicati a uno spazio di memoria molto più vasto senza i colli di bottiglia del bus di sistema da affrontare. Probabilmente ce ne sono altri qui, o su matematics.stackexchange.com,

In termini di requisiti di distanza infinita per la vista, certo, ma la domanda si riduce sempre a "quanti dettagli a quale distanza". Il rendering di dettagli infiniti richiederebbe risorse infinite. È qui che entra in gioco il mipmapping variabile per scena. Inoltre, tieni presente che tutte le strutture di dati rappresentano un compromesso di velocità per lo spazio o viceversa. Ciò significa rendering meno / più lento, se si desidera un mondo più ampio per lo stesso sforzo ingegneristico.


4

La prima conclusione che sono arrivato quando ho pensato a questo problema è che la memorizzazione dei dati della Terra in modo lineare è impossibile, supponendo che ogni voxel occupi solo 1 byte di memoria, ciò richiederebbe comunque 1 zettabyte per memorizzare la mappa. Quindi è richiesto un qualche tipo di compressione.

Dato che molto probabilmente non scoprirai mai le proprietà di ogni metro cubo del mondo reale, avrai bisogno di un modo per generare quei dati incerti sulla base di ipotesi. Quindi, se lo hai capito, non è necessario calcolare e archiviare tutti quei dati, ma puoi piuttosto generarli al volo.

Innanzitutto puoi scartare tutti i voxel all'interno della terra, perché questi dovranno essere calcolati solo se qualcuno scava davvero un buco, ad es. i voxel diventano visibili.

Per la superficie della terra, probabilmente prenderei un'immagine come punto di partenza per i miei calcoli. Forse una sorta di mappa della temperatura e dell'umidità ti permetterà di calcolare il tipo di blocchi da applicare. Per esempio. Acqua, sabbia (deserto), erba, neve ecc. Dato che probabilmente l'immagine non avrà un pixel di informazione per ogni metro quadrato della superficie terrestre, dovresti mescolarlo con un po 'di rumore per generare un po' di variazione su la superficie. Se usi sempre gli stessi semi casuali, il tuo risultato dovrebbe essere comunque deterministico.

Inoltre, sarebbe utile una mappa di prospetto, in modo da poter determinare l'altezza delle caratteristiche della superficie. In questo modo puoi aggiungere montagne ecc.

Quindi questo si riduce a un volume di dati di alcune immagini 2D che contengono informazioni sulla superficie terrestre. Per ogni cosa all'interno, torneresti ad un approccio procedurale puro, in cui renderizzi diversi tipi di blocchi, a seconda della distanza dal centro terra. Ma come detto sopra, questi devono essere calcolati solo quando qualcuno scava una buca.

Per rendere persistenti le modifiche, vorrei solo salvare le modifiche al mondo. Quindi, se qualcuno scava una buca, memorizzerei le informazioni su quali voxel sono stati rimossi, poiché dovrei essere in grado di rendere proceduralmente i voxel circostanti.

Per quanto riguarda il rendering: per farlo funzionare avrai bisogno di alcuni sofisticati algoritmi di livello di dettaglio e di abbattimento. È sciocco rendere tutti i voxel di superficie, quando la fotocamera è a un livello di zoom che mostra tutto il mondo. A questo livello, i voxel dovrebbero essere molto più grandi, forse anche una semplice sfera strutturata sarebbe sufficiente.

Immagino che la cosa più difficile sarebbe avere un generatore solido che ti permetta di calcolare le proprietà del voxel, anche per diverse "risoluzioni", in modo da poterlo usare per generare diversi livelli di dettaglio.


Il problema con il salvataggio delle sole modifiche è che si tratta di una soluzione a breve termine. Se i giocatori iniziano a modificare il pianeta, alla fine porterà a una situazione in cui i dati modificati sono grandi quanto il pianeta.
Cesar Canassa,

1
@CesarCanassa Non è uno scenario realistico avere più dati modificati rispetto ai dati del pianeta reale. Guarda cosa abbiamo cambiato noi umani sulla terra ... Direi che è solo una piccola percentuale della superficie terrestre. Gli oceani sono sostanzialmente intatti che costituiscono già la maggior parte della superficie terrestre. Immagina 1 milione di giocatori che giocano (costantemente) e 1 voxel per m2 di superficie terrestre (510.072.000 km2). Se ogni giocatore modificasse 1 voxel ogni 10 secondi, ci vorrebbero comunque ~ 160 anni per modificare la superficie. E questo non conta l'interno della terra!
Bummzack,

Modi per modificare i voxel in modo massiccio possono essere implementati, ad esempio una bomba atomica che esplode e affonda un'intera isola o potenti crepe che aprono il terremoto. Anche i dati modificati sono solo lo 0,0001% del volume terrestre, ovvero ancora 10 ^ 15 voxel
Cesar Canassa,

È vero che le modifiche sono piccole rispetto alla Terra, ma le modifiche che abbiamo apportato nel secolo scorso sono ancora piuttosto impressionanti: confrontare le immagini satellitari per il mare d'Aral degli anni '70 e della fine degli anni '90. (Una volta ho esaminato i cambiamenti che sarebbero necessari per retrodatare le moderne immagini satellitari a 100 m di risoluzione agli anni '40). E a una risoluzione di 1 m, anche i cambiamenti stagionali nella copertura del ghiaccio e della neve richiederanno tonnellate di dati, anche se non si arriva al punto di modellare gli iceberg.
Peter Taylor,

0

Puoi praticamente fare la stessa cosa che fa Minecraft. Invece di creare una tale quantità di dati, puoi definire un mondo come una formula matematica, ogni volta che un dato è richiesto per la visualizzazione, lo generi usando la formula.

Una tale formula è solitamente costruita usando il concetto di rumore Perlin , questo consente dettagli a tutti i livelli, puoi avere catene montuose grandi come quelle del mondo reale, ma scegli di generarne solo una piccola parte. Puoi generare la quantità di dettagli che ti piace, quindi è possibile creare dettagli molto fini per oggetti vicini, ma anche generare scenari lontani nel livello di dettaglio richiesto.

Minecraft salva tutti quei blocchi che hai visitato, completi di qualsiasi modifica sia stata apportata, si potrebbe semplicemente salvare solo la differenza tra il mondo generato e il mondo aggiornato, ma immagino che salvare blocchi di grandi dimensioni sia stato più semplice e comprimere relativamente bene.

Non penso che esista un gioco che lo porti davvero al limite, ma è molto comune usare la generazione formulaica di tutti i dettagli "non importanti" dei grandi mondi di gioco. Non sono sicuro di quanto sia comune l'approccio genera quando necessario, al contrario di generare semplicemente il lotto e metterlo sul disco.


2
Non sono a conoscenza di una formula matematica che descriva la terra in modo 1: 1.
MichaelHouse

Non "la" Terra, ma qualcosa di simile.
aaaaaaaaaaaa,

0

Potresti cercare i dati vettoriali delle masse terrestri della Terra, poiché i dati vettoriali hanno il vantaggio di adattarsi a qualsiasi scala tu voglia. Combinalo con una mappa di altezza della Terra per generare l'altezza del terreno. L'ultimo passo è alcune immagini satellitari dettagliate, da cui puoi scegliere il tipo di blocco superiore in base all'immagine, in modo da ottenere roccia dove c'è roccia, sabbia dove c'è sabbia, ecc. Probabilmente dovrebbero essere generate le parti interne reali del pianeta come fa Minecraft, a meno che non sia possibile trovare dati geografici dettagliati su cui lavorare. Fondamentalmente, quello che vuoi fare è trovare dati geografici ed estrapolarli da esso, dato solo l'input delle coordinate XYZ. Questo significa che hai dati limitati e estrapoli il resto nel modo più preciso possibile.

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.