Un desarrollador detalla los problemas técnicos no evidentes que encontró al portar a WebAssembly, mediante Emscripten, su juego Match Morphosis, escrito en C con un motor propio que usa bgfx, SDL2, miniaudio y cimgui. La experiencia sirve como guía práctica para quien enfrente un proyecto similar.
El primer obstáculo fue retomar Visual Studio: RemedyBG, su depurador habitual, no soporta procesos de 32 bits, y como WASM opera en un espacio de direcciones de 32 bits, necesitaba una compilación nativa de esa arquitectura para reproducir los errores localmente. Para ello basta con llamar a vcvars32 y ejecutar devenve sobre el ejecutable, sin necesidad de un archivo .sln.
El origen de la mayoría de los fallos fue la diferencia de tamaño de los punteros: al serializar estructuras con punteros en disco en 64 bits y cargarlas en WASM (32 bits), la disposición de los campos cambiaba y los datos de texturas y shaders se corrompían. La solución fue separar los datos de empaquetado de los de ejecución, usando un array plano paralelo que almacena los bytes y dejando la estructura serializada libre de punteros.
El artículo insiste en depurar en nativo de 32 bits (con AddressSanitizer y puntos de interrupción de datos) en lugar de hacerlo desde la consola del navegador. También describe un error clásico: confundir sizeof(ThingHandle*) con sizeof(ThingHandle) en una reserva de memoria, bug que en 64 bits quedaba oculto porque ambos tamaños coinciden.
Sobre el renderizado, advierte que OpenGL ES es mucho más estricto que Direct3D en layout de vértices, recuento de componentes y orientación del eje Y. Los shaders HLSL deben recompilarse a GLSL ES (perfil 300_es), sustituyendo lerp() por mix() y escribiendo literales float como 0.0 en lugar de 0. Por último, documenta un problema con Emscripten en el que hay que exportar explícitamente HEAPF32 para que miniaudio funcione. El juego ya está disponible en itch.io y cuenta con página en Steam.
