Serie: Aprender a programar con IA

Mirando atrás a GDC y el sprint de plataformas móviles

El lanzamiento de la víspera de GDC y el empujón de dos plataformas móviles.

Una API en C, todas las superficies Build de demo de GDC, iOS y Android enviados la misma semana API en C de RakuAI touch / audio / GPU / assets iOS · Metal Android · Oboe Demo de escritorio Respaldo en navegador Audio espacial: localización HRTF en cada plataforma
Añadir una plataforma es una forma conocida, no un problema arquitectónico abierto.

Un motor real ejecutando código real vence a cualquier presentación de diapositivas. RakuAI llevó uno a GDC, envió dos plataformas móviles la misma semana, y demostró que añadir una superficie nueva es una forma conocida, no una reescritura.

GDC fue hace un mes. El vuelo de regreso estuvo lleno de notas. Las conversaciones que empezaron en los pasillos y en reuniones paralelas todavía resuenan en la bandeja de entrada. Hoy es el sábado correcto para anotar lo que se envió en la preparación del viaje, lo que casi no lo logró, y lo que salió de todo eso.

GDC es el lugar donde descubres, en tres días de conversación densa, cuáles de tus suposiciones se sostienen y cuáles eran una conjetura que habías estado tratando como un hecho. Volví a casa con ambos tipos de respuestas y una lista más larga de personas a las que dar seguimiento de la que esperaba.

La etiqueta de la versión cuenta la historia

La versión que corrió en el portátil que llevé conmigo es v1.3.8.26.10.09. El commit que la incrementó tenía un mensaje de una línea: “GDC 2026 Eve Release.” Eso fue el 25 de marzo. Estaba en un avión a la mañana siguiente.

El commit de la víspera de GDC es sobre el que quiero escribir, porque es el que casi no llega a tiempo.

Cuarenta y ocho horas antes de volar

El build que todos acordaron que era “el build de demo” falló de cuatro formas distintas la semana antes de GDC. El commit de corrección es b70a48dc del 7 de marzo, incorporado en un solo PR titulado “fix(demos): fix black screens, crashes, and expand API test coverage.” Las cuatro formas:

Pantallas negras. El showcase de animación, la prueba de comportamiento de IA, la prueba booleana de CSG, y la prueba del framework de gameplay renderizaban todos en negro. La causa era una llamada faltante a raku_editor_init() que las demos necesitaban para registrar recursos de dibujo de depuración. Los objetivos de enlace de CMake se habían refactorizado un sprint antes y la biblioteca del editor se había podado de los binarios de demo porque nadie notó que dependían de ella. Corrección: volver a añadir el enlace, restaurar la llamada de init.

Un colapso por nulo. La demo de diálogo SLM colapsaba al arrancar con un puntero QA nulo. El cargador del modelo de diálogo regresaba temprano en una ruta de config-no-encontrada sin señalar el error. Corrección: exponer el error, y enviar una config funcional.

Una demo de red que se desconectaba de inmediato. La demo de eco de red abría un socket, obtenía el handshake, luego cerraba. La detección de desconexión se activaba en el primer frame inactivo en lugar de después de un timeout real. Corrección: timeout real en lugar de “primer inactivo.”

Una prueba de XR que salía con código 1 sin runtime de OpenXR. Salir con código distinto de cero sin runtime presente es el valor por defecto equivocado para una máquina de demo que puede no tener un runtime de XR instalado. Corrección: salir con código 0 de forma elegante, registrar la ausencia.

Ninguno de esos es ingenioso. Todos son el tipo de cosa que se ve bien en la máquina del desarrollador y se ve rota en la máquina de un extraño. Cuarenta y ocho horas antes de un viaje como este es exactamente cuando esos fallos salen a la luz, porque la demo finalmente se ejecuta en el portátil en el que realmente vivirá la próxima semana, frente a personas que se formarán una opinión en quince segundos.

Los commits de pulido que necesitaba tener listos a tiempo

Dos commits más del 26 de marzo, el día antes de irme.

Especularidad del plano de suelo. La demo del modelo de mundo tenía un plano de suelo verde y algunas formas flotantes. Con un material especular global aplicado, el suelo verde se lavaba a blanco bajo la iluminación de la demo. La corrección fueron diez líneas: material mate en el plano de suelo, especular solo en los objetos dinámicos. De repente la demo se veía como una dirección de arte deliberada en lugar de un motor a medio depurar.

GPU discreta de NVIDIA forzada en el portátil de la conferencia. Los portátiles híbridos con tanto Intel UHD como una tarjeta NVIDIA discreta van por defecto al chip Intel a menos que una pista explícita diga lo contrario. La pista son dos símbolos exportados: NvOptimusEnablement para NVIDIA Optimus, AmdPowerXpressRequestHighPerformance para el equivalente de AMD. Añadirlos al binario de demo forzó la GPU discreta. El HUD ahora también imprime el nombre de la GPU en la barra de título, así puedo ver de un vistazo en qué se está ejecutando realmente la demo. Resultado: corrió en la Quadro T2000 en lugar de la UHD integrada. El tiempo de frame se redujo a más de la mitad.

Ninguno de esos dos commits tiene más de cincuenta líneas. Ambos son la diferencia entre “la demo corre a treinta frames” y “la demo corre a noventa y se ve intencional.”

El respaldo en navegador que se convirtió en el mejor show-and-tell

La otra cosa que aterrizó en la semana de GDC fue una demo independiente de navegador en web/seed-explorer/. Un solo archivo HTML, cero dependencias, un port en JavaScript del generador de terreno de ruido Simplex que el runtime usa del lado nativo. Renderiza tres vistas de un mundo generado en un canvas de 512x512 usando putImageData: mapa de biomas, mapa de altura, mapa de temperatura. Hay un esquema de URL raku://seed/ integrado para que una semilla sea compartible.

Se suponía que era un respaldo por si el portátil fallaba o el wifi del recinto era un desastre. Se convirtió en lo que en realidad abría con más frecuencia en conversaciones paralelas. El portátil de otra persona en la mesa de una cafetería no puede instalar nuestro SDK en el momento, pero puede cargar una URL. La conversación pasa de “envíame los binarios” a “abre este enlace.” Ese es un tipo distinto de conversación. La demo de navegador se queda en la rotación.

El sprint de plataformas móviles

La otra mitad de marzo fue iOS y Android, ambos enviados en la misma semana.

Android. Doce commits en la serie F1 (F1.2 a F1.15), empezando con el andamiaje de NativeActivity y el puente JNI y terminando con el perfilador de rendimiento de Android. En medio: entrada táctil conectada a través de JNI, workflow de GitHub Actions para builds de AAB, integración de Firebase Crashlytics, y Oboe activado como backend de audio. Oboe es la elección correcta para audio de baja latencia en Android. El wrapper de API en C alrededor de él permite que los mismos callbacks de audio funcionen entre plataformas.

iOS. Siete commits en la serie F2 (F2.1 a F2.7) en dos días. Empezó con el proyecto de Xcode y el shell de la app en Swift. Se añadió una cadena de herramientas de cross-compilación arm64. Se conectó Metal como el renderizador (el mensaje del commit F2.2 dice “iOS Metal renderer integration, glue layer, CMake toolchain, 51 tests” y el conteo de pruebas es la parte de la que estoy más orgulloso). Se añadió entrada de gestos a través de UIGestureRecognizer. Se construyó el backend de audio espacial sobre AVAudioEngine. Se conectó la descarga y el cacheo de paquetes de assets a través de URLSession.

Ambas plataformas obtuvieron la misma forma: una capa nativa delgada que expone touch, audio, GPU, y entrega de assets a la misma API en C que usa el runtime de escritorio. Ese es el contrato. El código específico de plataforma es la implementación. Añadir una plataforma nueva desde aquí es una forma conocida, no un problema arquitectónico abierto.

El audio espacial es la victoria subestimada

La pieza de trabajo sobre la que sigo recibiendo preguntas es el audio espacial. El encabezado está en include/raku/raku_spatial_audio.h. La implementación se divide entre plataformas: procesamiento HRTF para localización espacial, grupos de mezclador para control por canal, efectos (reverb, delay), y zonas de reverb para acústica de habitación. En Android la ruta de audio es Oboe. En iOS es AVAudioEngine. El commit de audio espacial es e0aef6c6 del 6 de marzo.

La razón por la que esto importa para un motor de AR es que el audio es la mitad de la presencia. La AR visual con audio estéreo (o peor, mono) rompe la inmersión en el momento en que el usuario gira la cabeza. El audio espacial que se actualiza mientras el usuario se mueve hace que el contenido virtual se sienta como si estuviera en la habitación. El costo es real: el procesamiento HRTF no es gratis. El beneficio también es real: nadie ha vuelto de una buena demo de audio espacial queriendo que se desactive.

Qué movió realmente GDC

Tres cosas que vale la pena anotar.

Conversaciones con socios. Las conversaciones de pasillo y las reuniones paralelas son las que ahora están aterrizando en el calendario. Las charlas de la conferencia fueron excelentes. Las conversaciones entre las charlas fueron la razón por la que el viaje se pagó a sí mismo. Cuando escriba específicamente sobre direcciones de socios en un sábado futuro, esos hilos serán la sustancia.

Una lectura más clara de dónde está el campo. Hubo sesiones sobre modelos de mundo, sobre pipelines de contenido impulsados por IA, sobre la brecha entre demos de investigación y runtimes distribuibles, sobre la hoja de ruta de hardware de AR espacial de varios proveedores distintos. Parte de lo que asumía sobre el panorama competitivo era correcto. Unas pocas cosas por las que había estado preocupándome en silencio resultaron ser menos amenaza de lo que pensaba. Unas pocas cosas por las que no me había estado preocupando resultaron merecer más atención. Esa recalibración por sí sola valió el vuelo.

Permiso para seguir adelante. GDC fue un factor forzante. La demo que llevé no era perfecta. Era específica, era un motor real ejecutando código real, y respondía a una categoría distinta de pregunta que una presentación de diapositivas. El número de respuestas de “envíame un correo de seguimiento” fue lo bastante alto para confirmar que la dirección es la correcta. Esa es la métrica.

Las plataformas móviles se enviaron. Las demos que mostré funcionaron. El respaldo en navegador se convirtió en una función. Sábado bien empleado.

El runtime construido para el dispositivo en tu rostro

Una API en C, audio espacial en todas partes, y un runtime consciente de la temperatura diseñado para gafas inteligentes, no un motor de PC comprimido para que quepa. Descubre dónde vive tu IA en el mundo real.

← Todas las entradas