Kirino 的游戏宝藏
← Volver al número 022
Observación de juegos

1,4 segundos y ocho millones de píxeles en la repetición, cómo Alex van Rossum usó digests para clavar los tirones de Wreckwing en un trabajo reproducible

Si el valor por defecto en juegos de vuelo destructivo suele ser «primero haz que el derrumbe se vea ruidoso, luego mata el tirón a ojo: baja efectos, corta fragmentos, adivina…

Mis guardados ↗

Si el valor por defecto en juegos de vuelo destructivo suele ser «primero haz que el derrumbe se vea ruidoso, luego mata el tirón a ojo: baja efectos, corta fragmentos, adivina qué fotograma cuesta», entonces a principios de octubre de 2026 las cifras que Alex van Rossum, del estudio indie holandés Trilithon Games, desplegó en los diarios de su motor reescribieron esa factura por defecto en una orden de trabajo reproducible. El juego se llama *Wreckwing*, corre en Mac Apple silicon, sobre el motor propio Trilithon Engine: Swift, Metal y Jolt Physics. Aún no hay página de tienda; el título sigue en desarrollo. Este ensayo no jugó un build terminado. Escenas y cifras vienen de los posts públicos del autor y del sitio del estudio.

Alineé las notas de motor que pude encontrar. Los hechos duros son claros. El 6 de octubre, el juego en ciudades grandes encadenó ralentizaciones, una vez casi a paso de tortuga. La telemetría las situó en la simulación, 0,7 a 1,4 s después de cargas que rompieron de 140 a 500 piezas estructurales. Los tirones reportados en juego iban de 0,2 a 1,4 s. En la misma semana también escribieron sobre digests deterministas, repetición headless y cómo la iluminación puede saltar píxeles en un fotograma 4K. Los borradores salieron con Claude Code en el repositorio; Alex van Rossum revisó cada cifra.

La imagen que atraviesa este texto es la repetición, y el digest. Suenan a nombres de herramientas. En ética de producción son una promesa comprobable. Primero haz que el mundo se repita bajo la misma huella; después habla de qué corte ahorró tiempo. El ahorro debe dejar evidencia. Cambió el tiempo. La huella del mundo sigue coincidiendo.

Derrumbe de torre en Wreckwing

1. Valor por defecto de la industria, adivinar el tirón, cortar efectos para «optimizar»

Todo el mundo sabe que la destrucción es cara. Una explosión fractura la estructura, los escombros se mantienen despiertos entre sí y el render sigue quitando piezas ya rotas. El flujo por defecto también está fijo. Primero se dice a ojo que «debe ser física», luego se prueban menos fragmentos, congelar escombros antes o bajar luces y sombras. Los jugadores aprenden el mismo vocabulario. Dicen que tras una explosión hay un tirón, o que en ciudades grandes no abran High. Ese acuerdo vuelve perdonable la adivinanza como gramática de producción.

*Wreckwing* encarece adivinar. Es vuelo destructivo en ciudades grandes. Un misil puede abrir un cráter de decenas de metros. Una salva de cohetes puede despertar decenas de miles de cuerpos recién rotos. El segundo caro suele apilar el hook de retirada, la deduplicación de terreno, la presentación del blast, la compactación de mallas y las comprobaciones de apoyo, cada uno capaz de sumar decenas o cientos de milisegundos. Si solo sientes qué fotograma tira, puedes arreglar la causa equivocada, o la correcta y cambiar el mundo.

La bifurcación está aquí. El valor por defecto pregunta qué efecto apagar para que el frame rate se vea mejor. Ellos preguntaron si ese 1,4 s podía clavarse primero como sesión reproducible, medirse y arreglarse ítem a ítem, con una huella del mundo que pruebe que el derrumbe que encuentra el jugador sigue siendo el mismo.

Héroe del devlog de stalls por repetición

2. Método, buffer circular de 4096 fotogramas, tecla marcador, repetición headless, digests

La mañana del 6 de octubre primero se fabricaron una forma de señalar el tirón. El juego guarda en memoria los últimos 4096 fotogramas de juego en vivo, unos 34 s a 120 fps, con tiempos de cada parte del fotograma y de cada fase de simulación. Pulsar X en el teclado o Y en el mando muestra un conteo Marked y guarda la cámara más 20 s antes y 5 s después. Cualquier fotograma de más de 40 ms se guarda con su desglose aunque nadie marque. Grabar un fotograma costó menos de 5 µs de hilo principal en la mediana. Con grabación on u off, el estado final coincidía.

Un buffer circular no basta. El juego ya registra cada sesión. Una herramienta de repetición puede, sin ventana, volver a disparar blasts y cañonazos registrados en sus tiempos de juego originales, en la ciudad que esa sesión cargó por última vez. Una repetición de ciudad mixta alcanzó 836 ms en un solo paso de física. Un paso de física es un trozo de 1/60 s de tiempo simulado que el motor calcula de una vez. El tirón pasó a ser un experimento repetible. Cada arreglo se comprobó rejugando una sesión registrada y comparando un state digest, huella del mundo entero al final de la corrida. Si el digest coincidía, el arreglo cambió el tiempo y nada más.

El determinismo es la base de ese método, escrito unos días antes. El 29 de septiembre, dos grabaciones de la misma demolición de oficina no coincidieron: 696 miembros caídos en una, 1123 en la otra. Siguieron las reglas del propio motor de física para resultados repetibles: consultas, listas de cuerpos activos, eventos de impacto y contactos ordenados; fracturas aplicadas en orden de petición tras esperar las anteriores. Después, la escena dio 1266 miembros caídos y digests coincidentes en captura, grabación y frame bench. Un digest huella cada posición de cuerpo al milímetro. Un milímetro de diferencia, y el digest cambia.

El 1 de octubre empezaron a separar simulación, fractura y paso en módulos de motor reutilizables. Cada paso debía dejar el mundo exactamente igual. Así nació `tools/digests.sh`. Corre 13 escenas de prueba, repite dos sesiones de juego, más un paso cada dos ticks y otra con sonido, y capturas de pantalla de cada escena; compara digests con una línea base en un build release con conmutadores de entorno limpios. Una pasada completa tarda unos 10 minutos. El modo headless quita ventana, render y sonido. Diez escenas terminan en cerca de un minuto con los mismos digests que la app renderizada, lo que muestra que nada dibujado vuelve a alimentar la simulación.

La repetición también puede mentir. Una sesión del centro difirió en cerca de una de cada siete; una de distrito en cerca de una de cada cinco. Las ventanas de prueba robaban el foco al arrancar, así que teclas pulsadas en otro sitio llegaban a la simulación. Una pulsación de T a mitad de corrida bajaba la calidad de alta a media. La reparación fue prosaica. Las corridas offline muestran su ventana sin tomar el foco, descartan teclas y clics, y fijan el nivel de calidad por línea de comandos. Inyectar un aviso de estado de energía y una T a los 600 pasos de un frame bench sigue terminando en el mismo estado. Tres repeticiones del centro coincidieron.

Ahí el método quedó completo. El buffer circular señala. La repetición headless repite. Los digests prueban. Un script de diez minutos vuelve la prueba cotidiana.

3. Hoja de cargos, hook, hash, blast, compactación y la decisión de producto de 1,4 segundos

Con una sesión reproducible dividieron causas en una tabla y movieron una cada vez.

El hook de retirada del renderer recorría cada pieza dibujada de la escena por cada pieza rota: muebles, molduras, coches, naves. Dos misiles en una ciudad gastaban 124 y 134 ms aplicando fracturas terminadas. Tras el arreglo: 7,9 y 8,1 ms.

Un hash de vértices de terreno leía solo los bits bajos de un producto. En una cuadrícula de metros enteros y cuartos esos bits suelen ser cero, así que los vértices se amontonaban en pocos slots. Los cráteres de un misil costaron 192 ms; el peor fotograma de simulación en la repetición llegó a 202 ms. Tras mezclar bits con el finalizer de Murmur3, el peor sim bajó a 31,5 ms.

Presentar un blast de 40 m buscaba en todo su alcance de 100 m y consultaba la estructura de cada cuerpo. En repetición: 52 y 83 ms; en juego vivo una vez 86 ms de un fotograma de 164. Después: 5,1 y 6,1 ms en repetición.

Compactar las mallas dibujadas de la ciudad en un fotograma costó 221 ms en repetición y 233 a 311 en juego. La primera pasada lo dejó en 87 ms. Una segunda ronda en la sesión del 7 de octubre bajó 125 y 134 ms a 60 y 65. En una repetición de ciudad grande en nivel bajo, los pasos de más de 33 ms cayeron de 40–79 por corrida a 4–48. Las comprobaciones de apoyo de cráter bajaron de 32 ms (cráter de 64 m, unos 30 en la comprobación) a 12,6 ms.

Otra clase de sospechosos no ahorró nada. En la ventana más pesada de la primera ciudad bajo la línea base Low Power Mode, una salva de cohetes dejó hasta 22000 cuerpos despiertos, 99% escombros de fractura. Cerca de la mitad casi quietos, mantenidos despiertos por un grupo en contacto de 7000 a 9800 cuerpos que el motor de física solo puede dormir juntos. Los pasos llegaron a 84–114 ms. Menos hilos de trabajo, menos iteraciones del solver, caché de contactos más floja, umbral de sueño más flojo y un suelo de blast no ahorraron nada. Congelar escombros a 1 s en vez de 2 bajó el paso más lento a 62–70 ms.

La decisión de producto aparece aquí. Dos caminos para bajar carga: congelar escombros antes, o hacer menos fragmentos. Mantuvieron el fracturado como está y eligieron congelar a 1,4 s, no al 1 s de la prueba. El cambio en nivel alto de 2 s a 1,4 s espera una segunda repetición que lo confirme. La mañana del 7 de octubre, diez minutos de juego en el centro grande fueron la nueva línea base de repetición. Los congelados de un segundo casi desaparecieron. Un misil enorme en mitad de la ciudad, y otros grandes impactos, no congelaron. Marcaron un momento con escombros flotando.

La fuerza de la tabla rara vez viene de un porcentaje glamuroso en una fila. Viene de cifras de antes y después en cada fila, más la línea fría de aceptación: el digest coincidió. Bajó el coste de culpar a la causa equivocada. El riesgo de cambiar el mundo lo bloqueó una huella.

Héroe del teardown de fotograma 4K

4. Otro corte, luces sobre ocho millones de píxeles, y cómo «saltar» sigue siendo idéntico byte a byte

Tras cerrar la tabla de tirones, abrieron un fotograma 4K. Ciudad más grande, preset High, Low Power Mode: GPU unos 30 ms por fotograma en su bench, unos 33 fps. El mayor paso suelto fue superficie más iluminación, 13,1 ms.

La ablación fue directa. Sin toda la iluminación: 8,7 ms, así que la iluminación misma unos 4,5. Sin hasta doce luces dinámicas pequeñas: 10,7 ms, así que esas luces unos 2,5, más de la mitad de la iluminación. Visibilidad del cielo unos 0,9, rebote de calle unos 0,5, luces de habitación y bordes suaves PCSS ≈0 en el ruido. Ocho millones de píxeles, cada uno comprobando hasta doce luces tres veces: la luz, el brillo especular, el resplandor en humo. Las luces alcanzan como mucho unos 16 m. Casi todo píxel de calle queda fuera de cada bola y aun así hacía las comprobaciones vacías.

El cambio precalcula un rectángulo de pantalla con margen para cada luz. Un píxel solo comprueba luces cuyo rectángulo lo cubre. Una prueba de pared con tres luces dibujó fotogramas idénticos byte a byte en ambos modos. El paso pasó de 13,8 a 11,8 ms de media en pares de corridas, unos 2 ms del fotograma de 30. El límite está escrito con claridad. Los motores del jugador suelen ir justo delante de la cámara de persecución, así que el rectángulo de esa luz llena la pantalla y cada píxel sigue comprobándola; las demás se saltan.

El detalle de materiales se partió igual. Todos los materiales de detalle unos 2,9 ms; el ruido procedural de hormigón solo unos 1,3 de eso. Variación de color entre edificios unos 0,55; erosión y polvo asentado unos 0,3 cada uno. Dibujar los tres millones de triángulos de la ciudad en el G-buffer unos 3,5 ms. Un intento temprano de saltar edificios fuera de pantalla ahorró unos 0,4 ms pero sombreó 75 píxeles distinto; lo dejaron fuera. Las optimizaciones que cambian la imagen esperan stills de antes y después antes del tronco.

Notas laterales cubren assets y carga. El Sniper texturizado tiene 303458 tris frente a unos 8800. Seis Snipers a 3840×2160 High movieron el fotograma de 7,16 a 10,39 ms. Con un LOD de sombra de unos 30k tris, el coste de sombra cayó de 1,9 a 0,2 ms. La carga de ciudad ancha de 9,7 a 3,1 s; el tirón de montar el wreck de cañonera de 290 a 12 ms. Esas cifras están en las notas de seguimiento 0.15.x, misma dirección que la línea principal. Medir primero, cambiar la forma, luego probar que el aspecto o el mundo no se cambiaron en silencio.

Cierre, indie es estar dispuesto a pagar diez minutos por reproducibilidad

Devuelve este racimo de octubre a la sala de motores indie del otoño de 2026 y lo primero que golpea es un hábito callado. Los equipos adivinan tirones por defecto, cortan efectos como optimización, dan por suficiente «tras el parche corre», y rara vez preguntan si el mundo tras el arreglo sigue siendo la misma partida. Alex van Rossum abrió otro camino. La herramienta puede ser tan prosaica como una tecla marcador. La aceptación puede ser tan dura como un digest al milímetro. Un `digests.sh` de diez minutos puede convertir el determinismo de eslogan en puerta diaria.

Para equipos pequeños el material es especialmente útil. Puede que no envíes un motor Swift, y puede que no despiertes 22000 cuerpos de escombro. Sí tienes una lista de «ya basta». Un tirón post-explosión atribuido a ojo. Una optimización que mira medias e ignora los peores pasos. Un refactor sin gemelo headless. Una ventana de prueba que robó el foco y convirtió una repetición flaky en «la física no es determinista». La tarea pública de Trilithon escribe el coste en cifras llanas. Grabar un fotograma puede quedarse bajo 5 µs. Diez escenas headless cerca de un minuto. Digests completos cerca de diez minutos. Lo caro es estar dispuesto a pagar esos diez minutos cada día, y admitir en términos de producto que un congelado de 1,4 s es la elección explícita tras conservar la densidad de fractura.

Las consignas ejecutables son cortas.

  • Dale a los tirones una forma de ser señalados. Buffer circular, auto-guardado sobre presupuesto, marcador con ventanas antes/después. Aterriza al menos una antes de la reunión de optimización.
  • En cada arreglo de rendimiento, dos preguntas. Cuáles son las cifras de antes y después, y si la huella del mundo sigue coincidiendo. Una aceleración que falla el digest es un defecto primero, no una victoria.
  • Si sospechas que el render alimenta la sim, corre headless y con render. Digests coincidentes desbloquean cortar en la calidad de imagen.
  • Culls y bakes que cambian la imagen reciben primero una comprobación byte a byte o de stills. Dos milisegundos con bytes idénticos pueden entrar al tronco. Setenta y cinco píxeles distintos por 0,4 ms pueden quedarse como nota y esperar.

1,4 s de tirón, un solo paso de 836 ms, luces sobre ocho millones de píxeles, diez minutos de digests. Antes de que abra una página de tienda, el autor ya escribió el estándar de auditoría en logs públicos. Haz que el derrumbe se repita primero. Después abarata el tiempo.

小光

Fuentes y lectura adicional

Alex van Rossum / Trilithon Games (2026-10-07) Finding 1.4-second stalls by replaying play

Alex van Rossum / Trilithon Games (2026-10-01) Making a collapse repeat exactly

Alex van Rossum / Trilithon Games (2026-10-13) Skipping pixels and tearing down a 4K frame

Alex van Rossum / Trilithon Games (2026-10-10) Textured ship models

Trilithon Games (2026-10-07) Release 0.15

Trilithon Games Since 0.15.5

Página de *Wreckwing* https://trilithon.games/games/wreckwing/

Press kit https://trilithon.games/press/

Accede para guardar tus lecturas.

Consulta tus Me gusta y artículos guardados en cualquier dispositivo.

Acceder