Ho riscontrato alcuni problemi nel determinare in modo efficiente se le stanze di grandi dimensioni sono sigillate in stanze 3D basate su voxel. Sono in un punto in cui ho fatto del mio meglio per risolvere il problema senza chiedere aiuto, ma non ho provato abbastanza a rinunciare, quindi chiedo aiuto.
Per chiarire, sigillato essendo che non ci sono buchi nella stanza. Ci sono sigillanti di ossigeno, che controllano se la stanza è sigillata e sigillano in base al livello di ingresso di ossigeno.
In questo momento, ecco come lo sto facendo:
- A partire dal blocco sopra la piastrella del sigillante (lo sfiato si trova sulla faccia superiore del sigillante), ricicla in modo ricorsivo in tutte e 6 le direzioni adiacenti
- Se la tessera adiacente è una tessera piena, non sotto vuoto, continuare attraverso il ciclo
- Se la piastrella adiacente non è piena o è una piastrella a vuoto, verificare se i blocchi adiacenti lo sono, in modo ricorsivo.
- Ogni volta che viene controllata una tessera, decrementa un contatore
- Se il conteggio arriva a zero, se l'ultimo blocco è adiacente a una piastrella del vuoto, restituisce che l'area non è sigillata
- Se il conteggio raggiunge lo zero e l'ultimo blocco non è una tessera sottovuoto, oppure il circuito ricorsivo termina (non rimangono tessere sottovuoto) prima che il contatore sia zero, l'area viene sigillata
Se l'area non è sigillata, eseguire nuovamente il ciclo con alcune modifiche:
- Controllo dei blocchi adiacenti per la piastrella "aria respirabile" anziché una piastrella a vuoto
- Invece di utilizzare un contatore decrementante, continua fino a quando non viene trovata alcuna piastrella ad "aria respirabile" adiacente.
- Una volta terminato il ciclo, impostare ciascun blocco selezionato su una piastrella del vuoto.
Ecco il codice che sto usando: http://pastebin.com/NimyKncC
Il problema:
Sto eseguendo questo controllo ogni 3 secondi, a volte un sigillante dovrà passare attraverso centinaia di blocchi, e un grande mondo con molti sigillanti di ossigeno, questi cicli multipli ricorsivi ogni pochi secondi possono essere molto difficili per la CPU.
Mi chiedevo se qualcuno con più esperienza nell'ottimizzazione potesse darmi una mano, o almeno indirizzarmi nella giusta direzione. Grazie mille.