Caricamento di blocchi attorno al centro

0

Sto facendo un gioco di voxel come Minecraft. Sono in grado di caricare blocchi usando il multithreading con il codice ...

for (int x = 0; x < WorldSettings.WORLD_WIDTH_IN_CHUNKS; x++)
{
    for (int y = 0; y < WorldSettings.WORLD_LENGTH_IN_CHUNKS; y++)
    {
        chunks[x, y].BulidVertexData();
        Thread.Sleep(50);
    }
}

funziona bene, inizia caricando il chunk lontano e li carica avanti e indietro come un tergicristallo che si avvicina, ma preferirei farlo caricare in cerchio attorno al giocatore caricando prima i blocchi vicini. Qualche idea?

    
posta Liamdev631 11.06.2013 - 16:15
fonte

2 risposte

0

Un punto di riferimento ovvio sarebbe Minecraft stesso.

Le mappe Minecraft sono effettivamente memorizzate come una matrice tridimensionale all'interno del file della mappa.

I blocchi dalla mappa vengono caricati in base alle coordinate e ai movimenti del giocatore. I pezzi più vicini al giocatore vengono caricati prima e poi vengono caricati i pezzi più distanti. Essenzialmente, è un algoritmo a spirale centrato attorno alle coordinate del giocatore.

Ad un certo punto dal giocatore, il caricatore smette di caricare blocchi per la visualizzazione poiché sono oltre la risoluzione del fotogramma.

È possibile aggiungere ulteriori intelligenze per limitare il caricamento in base all'opacità dei blocchi e / o in base alla direzione che il giocatore sta visualizzando. Vorrei verificare i tempi di esecuzione prima di implementare tali modifiche in quanto potrebbero essere inutili micro-ottimizzazioni.

    
risposta data 11.06.2013 - 16:37
fonte
2

Una cosa che potresti fare è memorizzare i tuoi blocchi in un quadrifoglio che rappresenta le suddivisioni del piano xy, o qualche struttura simile , quindi eseguire una ricerca del raggio per individuare quelli vicini al lettore da caricare. Potresti eseguire ricerche di raggio più grandi per disegnare verso l'esterno, o potresti eseguire un ordinamento a distanza secondaria sui risultati di ricerca con la distanza di disegno completa come raggio per ottenere l'ordine di disegno.

Tuttavia ... sembra che tu stia caricando il tuo intero mondo in una volta sola? Non potrei dire per certo senza più contesto, ma sembra che questo limiti davvero le dimensioni del tuo mondo. Minecraft usa in parte pezzi in modo che possa caricare solo una piccola parte del mondo (attorno al giocatore) nella memoria in una sola volta, ma caricarli tutti in una volta nega questo vantaggio. Ce ne sono altri, per essere sicuri, ma potresti prendere in considerazione la possibilità di riconsiderare il metodo load-'-all-at-once.

Se hai usato un quadruplo (o qualcosa di simile) per memorizzare i tuoi riferimenti (non caricarli finché non ne hai bisogno, e magari non caricare nemmeno l'intero albero finché non ne hai bisogno!), ti darebbe il cerca i vantaggi descritti sopra e ti consente anche di scarsamente popolato un mondo enorme con solo i pezzi esplorati dal giocatore.

    
risposta data 11.06.2013 - 19:10
fonte

Leggi altre domande sui tag