voxelforge

Un motor voxel con una demo jugable en el navegador. El renderer apunta a WebGL2/WASM, mientras que el núcleo de simulación se compila de forma nativa y está cubierto por pruebas - decenas de miles de aserciones.

voxelforge
TL;DR

Un motor voxel con una demo jugable en el navegador. El truco es que el núcleo de simulación no sabe nada del renderizado - lo que permite probar la lógica sin GPU, a lo largo de decenas de miles de aserciones.

Descripción general

voxelforge es un motor voxel con una demo jugable que corre en el navegador. El renderizador apunta a WebGL2 y WASM, pero la decisión más interesante no es sobre los gráficos, sino sobre la arquitectura: el núcleo de simulación está completamente separado del dibujado. Es el que sostiene los voxeles, las reglas y las vecindades, y no sabe nada de que algo aparezca en la pantalla.

Esa sola decisión cambió el carácter del proyecto. En lugar de un motor que solo funciona si lo lanzas con una tarjeta gráfica, nació una biblioteca de lógica que corre en todas partes y se puede probar como código ordinario. El resto de este caso de estudio cuenta por qué mereció la pena.

Un motor voxel tiene que hacer dos cosas difíciles a la vez: dibujar el mundo rápido y simularlo correctamente. Ambas son fáciles de romper de una forma que a primera vista parece bien y sin embargo está mal - un bloque desaparece un fotograma demasiado tarde, una vecindad se cuenta un voxel al lado. Esos errores no gritan, rompen el mundo en silencio.

Cuando el renderizado y la lógica están trenzados en un mismo cuerpo de código, no se pueden separar ni para probar ni para depurar. No se puede saber si un bloque desapareció mal porque la simulación lo calculó mal, o porque el renderizador lo dibujó mal. Desenredar esos dos mundos fue lo más importante de todo el proyecto.

Un núcleo que no conoce la GPU

La solución era a la vez la más simple: el núcleo de simulación es lógica pura, y el renderizador toma su estado y lo convierte en triángulos. Ninguna parte del núcleo toca un canvas ni una GPU. La interfaz entre ellos es estrecha y explícita, así que el renderizador puede ser cualquiera, y el núcleo no lo sabe.

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

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

Quién hace qué

CapaPapelDependencia de la GPU
Núcleo de simulaciónvoxeles, reglas, vecindadesninguna
Renderizadorconvertir el estado en triángulosWebGL2 / WASM
i
Nota

Como el núcleo no depende de una GPU, se construye de forma nativa y se prueba como una biblioteca normal. El renderizador apunta a WebGL2 y WASM, pero la lógica pasa sus pruebas incluso en una máquina de CI sin tarjeta gráfica.

Pruebas en lugar de esperanza

Esta separación no es un lujo académico. Es la razón por la que la simulación tiene una cobertura de pruebas del orden de decenas de miles de aserciones - y es la única forma de decir que un motor voxel es correcto, y no solo que "parece bien". Los errores de un voxel al lado salen en una prueba, no tras una hora de juego.

miles
voxeles por chunk
decenas de miles
aserciones en las pruebas del núcleo
0
dependencias del núcleo de la GPU

El resultado: una demo que crece sin miedo

Lo que sale es una demo jugable en el navegador que puede crecer sin miedo a romper en silencio la lógica del mundo por el camino. Como el núcleo está probado por su cuenta, un cambio en el renderizador no puede romper la simulación a escondidas, y un cambio en la simulación sale de inmediato en las aserciones. El motor no es solo vistoso - es verificable.

Más proyectos

Más trabajos de la misma categoría - mira cómo abordamos retos parecidos.

¿Tiene un proyecto similar?

Escríbenos - el presupuesto es gratuito y llega en una hora.