Editor de juegos estilo Unity que corre en WASM puro
(raverie-us.github.io)- Motor de juegos ligero que busca revivir la experiencia del antiguo Macromedia/Adobe Flash
- Diseñado para funcionar en todas las plataformas, con WASM puro como único objetivo de salida
- La salida no incluye ejecutables ni código glue, y no usa Emscripten
- La lista de imports y exports está claramente definida en PlatformCommunication.hpp
- Estructura fácil de implementar en cualquier plataforma, incluido el navegador
Descripción general
- Motor de juegos ligero (light-weight) cuyo objetivo es recrear la experiencia del antiguo Macromedia/Adobe Flash
Arquitectura
- Fue creado para ejecutarse en cualquier plataforma y tiene como único objetivo de salida WASM puro
- La salida no incluye ejecutables ni código glue, y no utiliza Emscripten
- La lista de imports y exports está definida de forma clara en PlatformCommunication.hpp, lo que permite implementarlo fácilmente en cualquier plataforma, incluido el navegador
1 comentarios
Opiniones en Hacker News
¡Wow, son quienes hicieron Zero Engine! Lo usé hace mucho en un campamento de verano de DigiPen, y programar en Zilch era realmente divertido.
También hice una IA que jugaba un clon de Galaga. Con todo este asunto de Unity me preguntaba qué habría pasado con Zero, y me emociona mucho que parezca que va a revivir.
Como dato adicional: en una laptop claramente de gama baja con gráficos integrados, funciona como otra gran presentación de diapositivas.
También lo probé en un viejo Mate 20 Pro y parecía quedarse trabado en “Downloading runtime”. No creo que fuera por el 4G inestable, así que abrí
chrome://inspecten la laptop por USB para revisar la pestaña, y apareció el errorUncaught (in promise) Error: Needs OES_texture_float_linear to function. Aunque termina siendo una pregunta filosófica si vale la pena crear una pantalla de error solo para mostrar el mensaje de que, de todos modos, no vas a poder jugar con eso.Me gusta el concepto. Pero mi GPU y mi navegador están llorando por la latencia, y se ve como una presentación de diapositivas impresionante.
Después de varios intentos, apenas pude seleccionar la esfera inicial. Al principio ni siquiera estaba seguro de si ya había terminado de cargar. Claro que estoy usando Firefox en un Celeron de 1.8 GHz, GPU integrada y 8 GB de RAM, así que estoy lejos de tener una máquina potente.
Como es un motor de juegos nativo portado a WASM, el problema estaba en el código de limitación de tasa de cuadros, que no encajaba bien con las API de temporización del navegador: https://raverie-us.github.io/raverie-engine/
La parte de “nuestro motor tenía una función única llamada Spaces, y podía instanciar mundos/niveles separados” me parece exactamente lo mismo que hace el motor Godot[1].
Ese motor también tiene un target para navegador (WASM). [1]: https://godotengine.org/
No parece ser una prioridad alta para el proyecto. Lo probé un poco y parece funcionar :), aunque es más lento que ejecutarlo de forma nativa.
Me pregunto si existe un flujo de desarrollo WASM que permita que las Web API del navegador y WASM puro interactúen sin una capa de JS, o con bajo costo.
A veces miro https://github.com/WebAssembly/proposals y es muy confuso. La propuesta de importación de tipos parece estar a años de distancia, y la propuesta de GC, que está casi lista, parece ser para lenguajes con GC, no para navegador↔WASM. El modelo de componentes parece estar lejos de los casos de uso del navegador, y JS String Builtins acelera las cadenas de JS, pero no el DOM. La integración con módulos ECMAScript convierte los módulos WASM en módulos ES, pero las Web API no son módulos ES, así que no ayuda. Al ver las conversaciones de los contribuidores, a veces parece que ofrecer esta capacidad no es una prioridad ni está en los planes, y para la mayoría parecen ser más importantes WASI y el modelo de componentes para usos como la nube y la criptografía.
Pero, como dices, no parece ser una prioridad para ellos. Ojalá algún día sea posible.
Si se importan todas las Web API relevantes, podrías pasar objetos JS tal cual entre llamadas individuales de API, con muy poco JS intermedio. En la práctica, el JS solo sería necesario más o menos al inicializar el módulo WASM por primera vez.
Gran proyecto. ¿Hay alguna forma de ampliar la UI en pantallas de alta resolución?
En una pantalla 2:1, la fuente se ve pixelada. Si pongo el zoom del navegador en 50%, la UI se ve nítida, pero todo queda demasiado pequeño y es difícil de usar.
window.innerWidth * window.devicePixelRatioy el alto enwindow.innerHeight * window.devicePixelRatio.Después, con CSS, maximizas el canvas en la pantalla.
Sería más barato en recursos (memoria, red, CPU), más fácil de hacer accesible y también más fácil de renderizar.
¡Trevor! Me encantaba la optativa de CS en DigiPen donde veíamos diseño de lenguajes de programación a través de la gramática.
Muchos de los estudiantes a los que enseñaste ahora trabajan en Minecraft. Mientras diseño la API de scripting de Minecraft, estoy usando las bases que aprendí entonces y muchas cosas de mi época en DigiPen. Me alegra ver que sigues haciendo cosas geniales.
También me encantaría ver la interfaz de scripting en la que estás trabajando. Antes hice muchísimos mods de Minecraft, y siempre quise alguna forma de scripting dinámico.
Realmente genial. Me alegra ver un producto basado en WASM puro en este campo. Aunque en mi M1 Mac Pro va bastante entrecortado.
Tengo una pregunta: ¿esto también corre en un NES? Es un modelo frontal reacondicionado, con la mayoría de las piezas originales, pero le agregué un poco más de RAM.
La pegué arriba con silicón caliente, pinté la carcasa de rojo y le puse unos soldaditos de juguete.
Incluso mostrando solo la escena básica de la pelota, golpea durísimo la GPU en una Radeon Pro 560X y un entorno casi 4K.
Solo rotar la cámara hace que la tasa de cuadros baje muchísimo. ¿Alguien sabe si puede haber un problema de optimización de WebGL?
Como es un motor de juegos nativo portado a WASM, el problema estaba en el código de limitación de tasa de cuadros, que no encajaba bien con las API de temporización del navegador: https://raverie-us.github.io/raverie-engine/