Desarrollamos juegos multiplataforma con Rust ~

I. Introducción

  Desde que cuando era niño me sumergí en la magia de los MODs de Warcraft III, siempre he tenido un cariño especial por los lenguajes de scripting de juegos. Mirando hacia atrás en ese momento, el lenguaje JASS desarrollado por Blizzard se utilizó para desarrollar los niveles de juego de Warcraft 3. Aunque JASS es extremadamente tosco desde la perspectiva actual, con sus características principales como escritura estática + sin función GC, era en una era en la que Los estándares de la industria aún no se habían formado, representa un intento audaz de desarrollar un lenguaje de juegos.

¿Por qué utilizar lenguajes de scripting para desarrollar juegos?

  La introducción del lenguaje de programación de juegos tiene como objetivo principal mejorar la conveniencia del desarrollo y las pruebas. Si utiliza directamente un lenguaje de bajo nivel como C++, cada vez que cambia una línea de código, es posible que deba pasar mucho tiempo esperando la compilación y empaquetado de la compleja cadena de herramientas. Al utilizar un lenguaje de secuencias de comandos, el programa que implementa el juego se puede cargar y ejecutar en caliente, lo que mejora significativamente la eficiencia del desarrollo del juego.

  Con el tiempo, los lenguajes de scripting escritos dinámicamente como Lua y JavaScript se han convertido en algo común en el desarrollo de juegos. Sin embargo, con el desarrollo de los lenguajes de programación, tenemos la oportunidad de redefinir un nuevo estándar para los lenguajes de programación de juegos, tanto retro como innovador. Esta es la combinación de Rust + WASM.

2. Rust + WASM + Dora SSR: redefiniendo el desarrollo de guiones para juegos

  Al combinar Rust y WASM, podemos actualizar y probar juegos directamente en dispositivos Android o iOS, por ejemplo, sin sacrificar el rendimiento, sin depender de cadenas de herramientas de desarrollo de aplicaciones tradicionales. Además, con la ayuda de la interfaz Web IDE del motor de juegos de código abierto Dora SSR, el código del juego escrito en Rust se puede compilar una vez, probar y ejecutar en una variedad de dispositivos de juego.

¿Por qué elegir Rust?

  Rust proporciona garantías de seguridad de memoria incomparables sin la necesidad de intervención del recolector de basura (GC), lo que lo hace ideal para el desarrollo de juegos, especialmente en escenarios sensibles al rendimiento. Combinado con WASM, Rust no solo puede proporcionar una eficiencia de ejecución de alto rendimiento, sino también mantener la coherencia y la seguridad entre plataformas.

Guía de inicio rápido

  Antes de comenzar el desarrollo, necesitamos instalar el motor de juego Dora SSR. El motor admite múltiples plataformas, incluidas Windows, Linux, macOS, iOS y Android. Para conocer los pasos y requisitos de instalación específicos, consulte la guía oficial de inicio rápido: Dora SSR Quick Start .

Versión Dora SSR v1.3.17 ejecutándose en macOS

Paso 1: crea un nuevo proyecto

  Después de iniciar el programa binario del motor Dora SSR, abra el IDE web de Dora SSR en el navegador, haga clic derecho en el árbol de recursos del juego a la izquierda, seleccione "Nuevo" y cree una nueva carpeta llamada "Hola".

Acceda al IDE web de Dora SSR en el navegador y cree una nueva carpeta

Paso 2: escribe el código del juego

  Luego cree un nuevo proyecto Rust en la línea de comando:

rustup target add wasm32-wasi
cargo new hello-dora --name init
cd hello-dora
cargo add dora_ssr

src/main.rsEscribir código en   :

use dora_ssr::*;

fn main () {
  let mut sprite = match Sprite::with_file("Image/logo.png") {
    Some(sprite) => sprite,
    None => return,
  };
  let mut sprite_clone = sprite.clone();
  sprite.schedule(once(move |mut co| async move {
    for i in (1..=3).rev() {
      p!("{}", i);
      sleep!(co, 1.0);
    }
    p!("Hello World");
    sprite_clone.perform_def(ActionDef::sequence(&vec![
      ActionDef::scale(0.1, 1.0, 0.5, EaseType::Linear),
      ActionDef::scale(0.5, 0.5, 1.0, EaseType::OutBack),
    ]));
  }));
}

  Cree y genere archivos WASM:

cargo build --release --target wasm32-wasi

Paso 3: carga y ejecuta el juego

  En Dora SSR Web IDE, haga clic derecho en la carpeta recién creada "Hola", seleccione "Cargar" y cargue el archivo WASM compilado init.wasm.

Cargar archivos a través de Web IDE puede ser más conveniente que usar scripts auxiliares

  O utilice el script auxiliar upload.py para cargar el archivo WASM en la carpeta del proyecto Rust. El comando es el siguiente. El parámetro IP es la dirección web IDE que se muestra después de iniciar Dora SSR. para ser cargado:

python3 upload.py "192.168.3.1" "Hello"

Utilice scripts para completar la compilación, cargar y comenzar a ejecutar con un solo clic

Paso 4: publica el juego

  En el árbol de recursos del juego en el lado izquierdo del editor, haga clic derecho en la carpeta del proyecto recién creada y seleccione "Descargar".

  Espere a que el navegador muestre un mensaje de descarga para el archivo de proyecto empaquetado.

3. Cómo lograrlo

  El proceso de implementación del soporte de desarrollo del lenguaje Rust y la incorporación del tiempo de ejecución WASM en Dora SSR es un nuevo intento y exploración técnica, que incluye principalmente tres pasos clave:

1. Diseño del lenguaje de definición de interfaz (IDL)

  Para integrar el tiempo de ejecución WASM y admitir el lenguaje Rust en un motor de juego escrito en C++, primero debe diseñar un lenguaje de definición de interfaz (IDL) para facilitar la comunicación y el intercambio de datos entre diferentes lenguajes de programación. El diseño de IDL se basa en la interfaz C++ y se agregan etiquetas adaptadas a las características del lenguaje Rust, como object, etc., para realizar el mapeo readonlyde optionalinterfaces entre idiomas. El siguiente es un ejemplo de interfaz de un WASM IDL diseñado por Dora SSR:

object class EntityGroup @ Group
{
	readonly common int count;
	optional readonly common Entity* first;
	optional Entity* find(function<bool(Entity* e)> func) const;
	static EntityGroup* create(VecStr components);
};

  Teniendo en cuenta las diferencias entre las características orientadas a objetos de C++ y la filosofía de diseño de Rust, simulamos parcialmente el comportamiento orientado a objetos en C++ en Rust, lo que requirió escribir algunos mecanismos adicionales en Rust para corresponder a clases y métodos en C++. Aunque este enfoque añade algo de trabajo de desarrollo, mantiene la interfaz limpia y el sistema mantenible.

2. Programa para generar código de pegamento.

  El segundo paso es escribir un programa para generar código adhesivo para llamarse entre C++, WASM y Rust a través de IDL. Para lograr esto, optamos por utilizar el lenguaje Yuescript creado por el proyecto Dora SSR. Yuescript es un lenguaje de programación dinámico basado en Lua. Combina la biblioteca de análisis de sintaxis lpeg en el ecosistema del lenguaje Lua para manejar el análisis IDL y la generación de código adhesivo. La ventaja de utilizar Yuescript es que hereda la flexibilidad y la ligereza de Lua, al tiempo que proporciona una sintaxis y funciones más ricas, adecuadas para manejar tareas complejas de generación de código. El siguiente es un extracto de código de un analizador IDL escrito utilizando gramática PEG.

Param = P {
	"Param"
	Param: V"Func" * White * Name / mark"callback" + Type * White * Name / mark"variable"
	Func: Ct P"function<" * White * Type * White * Ct P"(" * White * (V"Param" * (White * P"," * White * V"Param")^0 * White)^-1 * P")" * White * P">"
}

Method = Docs * Ct(White * MethodLabel) * White * Type * White * (C(P"operator==") + Name) * White * (P"@" * White * Name + Cc false) * White * Ct(P"(" * White * (Param * (White * P"," * White * Param)^0 * White)^-1 * P")") * White * C(P"const")^-1 * White * P";" / mark"method"

3. Incrustar el tiempo de ejecución WASM y la integración de código

  El último paso es integrar el tiempo de ejecución WASM y el código adhesivo C++ generado en el motor del juego para completar la integración del código. Para el tiempo de ejecución de WASM, elegimos utilizar WASM3, un intérprete WebAssembly liviano y de alto rendimiento que admite múltiples arquitecturas de CPU, simplifica la complejidad de la cadena de compilación y mejora la compatibilidad entre plataformas. De esta manera, Dora SSR puede admitir la ejecución de juegos desarrollados en Rust en dispositivos de hardware de diversas arquitecturas, lo que mejora en gran medida la accesibilidad y flexibilidad de los proyectos de juegos.

  Durante el proceso de integración, lanzamos un paquete crate para desarrolladores de Rust, que contiene todas las interfaces y herramientas necesarias para que los desarrolladores puedan desarrollar y volver a publicar fácilmente otros módulos de juego escritos en lenguaje Rust basados ​​en el motor de juego Dora SSR en el futuro.

4. Conclusión

  Elegir Dora SSR + Rust como herramienta de desarrollo de juegos no es solo una búsqueda de tecnología de punta, sino también una nueva exploración del proceso de desarrollo de juegos. Invitamos sinceramente a todos los que aman el desarrollo de juegos a unirse a nuestra comunidad y explorar juntos este emocionante viaje tecnológico. Bienvenido a visitar nuestro repositorio de GitHub y la página de inicio del proyecto para obtener más información y participar en nuestro desarrollo. ¡Creemos juntos una nueva era de desarrollo de juegos!

  Nuestro grupo Q ya está aquí, bienvenidos a jugar: 512620381

¡Compañero pollo deepin-IDE de "código abierto" y finalmente logró el arranque! Buen chico, Tencent realmente ha convertido Switch en una "máquina de aprendizaje pensante" Revisión de fallas de Tencent Cloud del 8 de abril y explicación de la situación Reconstrucción de inicio de escritorio remoto de RustDesk Cliente web Base de datos de terminal de código abierto WeChat basada en SQLite WCDB marcó el comienzo de una actualización importante Lista de abril de TIOBE: PHP cayó a un mínimo histórico, Fabrice Bellard, el padre de FFmpeg, lanzó la herramienta de compresión de audio TSAC , Google lanzó un modelo de código grande, CodeGemma , ¿te va a matar? Es tan bueno que es de código abierto: herramienta de edición de carteles e imágenes de código abierto
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/4925410/blog/11052782
Recomendado
Clasificación