voxelforge

Un motore voxel con demo giocabile nel browser. Il renderer punta a WebGL2/WASM, mentre il core di simulazione si compila in modo nativo ed è coperto da test - decine di migliaia di asserzioni.

voxelforge
TL;DR

Un motore voxel con una demo giocabile nel browser. Il trucco è che il core di simulazione non sa nulla del rendering - il che permette di testare la logica senza GPU, attraverso decine di migliaia di asserzioni.

Panoramica

voxelforge è un motore voxel con una demo giocabile che gira nel browser. Il renderer punta a WebGL2 e WASM, ma la decisione più interessante non riguarda la grafica, bensì l'architettura: il core di simulazione è completamente separato dal disegno. È lui a tenere i voxel, le regole e i vicinati, e non sa nulla del fatto che qualcosa appaia sullo schermo.

Questa singola decisione ha cambiato il carattere del progetto. Invece di un motore che funziona solo se lo avvii con una scheda grafica, è nata una libreria di logica che gira ovunque e si può testare come codice ordinario. Il resto di questo caso di studio racconta perché ne è valsa la pena.

Un motore voxel deve fare due cose difficili contemporaneamente: disegnare il mondo velocemente e simularlo correttamente. Entrambe sono facili da rompere in un modo che a prima vista sembra a posto eppure è sbagliato - un blocco sparisce un fotogramma troppo tardi, un vicinato viene contato un voxel accanto. Questi errori non gridano, rovinano il mondo in silenzio.

Quando rendering e logica sono intrecciati in un unico corpo di codice, non si possono separare né per i test né per il debug. Non si riesce a dire se un blocco è sparito male perché la simulazione lo ha calcolato male, o perché il renderer lo ha disegnato male. Districare questi due mondi è stata la cosa più importante di tutto il progetto.

Un core che non conosce la GPU

La soluzione era anche la più semplice: il core di simulazione è logica pura, e il renderer prende il suo stato e lo trasforma in triangoli. Nessuna parte del core tocca un canvas o una GPU. L'interfaccia tra loro è stretta ed esplicita, quindi il renderer può essere qualsiasi, e il core non lo sa.

core.ts · typescript
interface SimulationCore {
  tick(dt: number): void;
  voxelAt(x: number, y: number, z: number): Voxel;
}

interface Renderer {
  draw(core: SimulationCore): void;
}

Chi fa cosa

LivelloRuoloDipendenza dalla GPU
Core di simulazionevoxel, regole, vicinatinessuna
Renderertrasformare lo stato in triangoliWebGL2 / WASM
i
Nota

Poiché il core non dipende da una GPU, viene costruito nativamente e testato come una libreria normale. Il renderer punta a WebGL2 e WASM, ma la logica supera i suoi test anche su una macchina di CI senza scheda grafica.

Test invece di speranza

Questa separazione non è un lusso accademico. È il motivo per cui la simulazione ha una copertura di test dell'ordine di decine di migliaia di asserzioni - ed è l'unico modo per dire che un motore voxel è corretto, e non solo che "sembra a posto". Gli errori di un voxel accanto emergono in un test, non dopo un'ora di gioco.

migliaia
voxel per chunk
decine di migliaia
asserzioni nei test del core
0
dipendenze del core dalla GPU

Il risultato: una demo che cresce senza paura

Ne esce una demo giocabile nel browser che può crescere senza il timore di rompere in silenzio la logica del mondo lungo la strada. Poiché il core è testato a sé, una modifica nel renderer non può rompere di nascosto la simulazione, e una modifica nella simulazione emerge subito nelle asserzioni. Il motore non è solo scenografico - è verificabile.

Altri progetti

Altri lavori della stessa categoria - scopri come affrontiamo sfide simili.

Hai un progetto simile?

Contattaci - il preventivo è gratuito e arriva entro un'ora.