Développons des jeux multiplateformes avec Rust~

Introduction

  Depuis que j'ai été immergé dans la magie des MODs de Warcraft III quand j'étais enfant, j'ai toujours eu une affection particulière pour les langages de script de jeux. À cette époque, le langage JASS développé par Blizzard était utilisé pour développer les niveaux de jeu de Warcraft 3. Bien que JASS soit extrêmement rudimentaire du point de vue actuel, avec ses principales caractéristiques étant le typage statique + aucune fonction GC, c'était à une époque où les normes de l'industrie n'avaient pas encore été établies, représente une tentative audacieuse de langage de développement de jeux.

Pourquoi utiliser des langages de script pour développer des jeux ?

  L'introduction du langage de script de jeu vise principalement à améliorer la commodité du développement et des tests. Si vous utilisez directement un langage de bas niveau comme C++, chaque fois que vous modifiez une ligne de code, vous devrez peut-être passer beaucoup de temps à attendre la compilation et le packaging de la chaîne d'outils complexe. En utilisant un langage de script, le programme qui implémente le gameplay peut être chargé et exécuté à chaud, améliorant considérablement l'efficacité du développement du jeu.

  Au fil du temps, les langages de script typés dynamiquement comme Lua et JavaScript sont devenus monnaie courante dans le développement de jeux. Cependant, avec le développement des langages de programmation, nous avons l'opportunité de redéfinir un nouveau standard pour les langages de script de jeux - à la fois rétro et innovant. Il s'agit de la combinaison de Rust + WASM.

2. Rust + WASM + Dora SSR : redéfinir le développement de scripts de jeu

  En combinant Rust et WASM, nous pouvons mettre à jour à chaud et tester des jeux directement sur des appareils Android ou iOS, par exemple, sans sacrifier les performances, sans s'appuyer sur les chaînes d'outils de développement d'applications traditionnelles. De plus, grâce à l'interface Web IDE du moteur de jeu open source Dora SSR, le code de jeu écrit en Rust peut être compilé une fois, testé et exécuté sur une variété d'appareils de jeu.

Pourquoi choisir Rust ?

  Rust offre des garanties inégalées de sécurité de la mémoire sans nécessiter l'intervention d'un ramasse-miettes (GC), ce qui le rend idéal pour le développement de jeux, en particulier dans les scénarios sensibles aux performances. Combiné avec WASM, Rust peut non seulement fournir une efficacité d'exécution haute performance, mais également maintenir la cohérence et la sécurité multiplateforme.

Guide de démarrage rapide

  Avant de commencer le développement, nous devons installer le moteur de jeu Dora SSR. Le moteur prend en charge plusieurs plates-formes, notamment Windows, Linux, macOS, iOS et Android. Pour connaître les étapes et les exigences d'installation spécifiques, veuillez consulter le guide de démarrage rapide officiel : Dora SSR Quick Start .

Version Dora SSR v1.3.17 fonctionnant sur macOS

Étape 1 : Créer un nouveau projet

  Une fois le programme binaire du moteur Dora SSR démarré, ouvrez l'IDE Web Dora SSR dans le navigateur, cliquez avec le bouton droit sur l'arborescence des ressources du jeu à gauche, sélectionnez « Nouveau » et créez un nouveau dossier nommé « Bonjour ».

Accédez à l'IDE Web de Dora SSR dans le navigateur et créez un nouveau dossier

Étape 2 : Écrivez le code du jeu

  Créez ensuite un nouveau projet Rust sur la ligne de commande :

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

src/main.rsÉcrivez le code dans  :

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),
    ]));
  }));
}

  Construisez et générez des fichiers WASM :

cargo build --release --target wasm32-wasi

Étape 3 : Téléchargez et exécutez le jeu

  Dans Dora SSR Web IDE, cliquez avec le bouton droit sur le dossier nouvellement créé "Bonjour", sélectionnez "Télécharger" et téléchargez le fichier WASM compilé init.wasm.

Le téléchargement de fichiers via Web IDE peut être plus pratique que l'utilisation de scripts auxiliaires

  Ou utilisez le script auxiliaire upload.py pour télécharger le fichier WASM dans le dossier du projet Rust. Le paramètre IP est l'adresse Web IDE affichée après le démarrage de Dora SSR. à télécharger :

python3 upload.py "192.168.3.1" "Hello"

Utilisez des scripts pour terminer la compilation en un clic, télécharger et commencer à exécuter

Étape 4 : publier le jeu

  Dans l'arborescence des ressources du jeu sur le côté gauche de l'éditeur, cliquez avec le bouton droit sur le dossier du projet nouvellement créé et sélectionnez « Télécharger ».

  Attendez que le navigateur affiche une invite de téléchargement pour le fichier de projet packagé.

3. Comment y parvenir

  Le processus de mise en œuvre de la prise en charge du développement du langage Rust et de l'intégration du runtime WASM dans Dora SSR est une nouvelle exploration et tentative technique, qui comprend principalement trois étapes clés :

1. Conception du langage de définition d'interface (IDL)

  Pour intégrer le runtime WASM et prendre en charge le langage Rust sur un moteur de jeu écrit en C++, vous devez d'abord concevoir un langage de définition d'interface (IDL) pour faciliter la communication et l'échange de données entre différents langages de programmation. La conception d'IDL est basée sur l'interface C++, et des balises adaptées aux fonctionnalités du langage Rust sont ajoutées, telles que object, readonly, optionaletc., pour effectuer un mappage d'interface multilingue. Ce qui suit est un exemple d'interface d'un WASM IDL conçu par 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);
};

  Compte tenu des différences entre les fonctionnalités orientées objet du C++ et la philosophie de conception de Rust, nous avons partiellement simulé le comportement orienté objet en C++ dans Rust, ce qui a nécessité l'écriture de mécanismes supplémentaires dans Rust pour correspondre aux classes et méthodes en C++. Bien que cette approche ajoute du travail de développement, elle maintient l'interface propre et le système maintenable.

2. Programme pour générer du code de colle

  La deuxième étape consiste à écrire un programme pour générer du code de colle pour s'appeler entre C++, WASM et Rust via IDL. Pour y parvenir, nous avons choisi d'utiliser le langage Yuescript créé par le projet Dora SSR. Yuescript est un langage de programmation dynamique basé sur Lua. Il combine la bibliothèque d'analyse de syntaxe lpeg dans l'écosystème du langage Lua pour gérer l'analyse IDL et la génération de code de colle. L'avantage d'utiliser Yuescript est qu'il hérite de la flexibilité et de la légèreté de Lua, tout en fournissant une syntaxe et des fonctions plus riches, adaptées à la gestion de tâches complexes de génération de code. Ce qui suit est un extrait de code d'un analyseur IDL écrit en utilisant la grammaire 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. Intégrer le runtime WASM et l'intégration du code

  La dernière étape consiste à intégrer le runtime WASM et le code de colle C++ généré dans le moteur de jeu pour terminer l'intégration du code. Pour le runtime WASM, nous avons choisi d'utiliser WASM3, un interpréteur WebAssembly léger et hautes performances qui prend en charge plusieurs architectures de processeur, simplifie la complexité de la chaîne de compilation et améliore la compatibilité multiplateforme. De cette manière, Dora SSR peut prendre en charge l'exécution de jeux développés dans Rust sur des périphériques matériels de différentes architectures, améliorant ainsi considérablement l'accessibilité et la flexibilité des projets de jeux.

  Au cours du processus d'intégration, nous avons publié un package crate pour les développeurs Rust, qui contient toutes les interfaces et outils nécessaires afin que les développeurs puissent facilement développer et republier d'autres modules de jeu écrits dans le langage Rust basés sur le moteur de jeu Dora SSR à l'avenir.

4. Conclusion

  Choisir Dora SSR + Rust comme outil de développement de jeux n'est pas seulement une recherche de pointe de la technologie, mais aussi une nouvelle exploration du processus de développement de jeux. Nous invitons sincèrement tous ceux qui aiment le développement de jeux à rejoindre notre communauté et à explorer ensemble ce voyage technologique passionnant. Bienvenue à visiter notre référentiel GitHub et la page d'accueil du projet pour en savoir plus et participer à notre développement. Créons ensemble une nouvelle ère de développement de jeux !

  Notre groupe Q est ici, bienvenue pour jouer : 512620381

Un camarade de poulet "open source" deepin-IDE et a finalement réalisé l'amorçage ! Bon gars, Tencent a vraiment transformé Switch en une « machine d'apprentissage pensante » Examen des échecs de Tencent Cloud le 8 avril et explication de la situation Reconstruction du démarrage du bureau à distance RustDesk Client Web La base de données de terminal open source de WeChat basée sur SQLite WCDB a inauguré une mise à niveau majeure Liste d'avril TIOBE : PHP est tombé à un plus bas historique, Fabrice Bellard, le père de FFmpeg, a sorti l'outil de compression audio TSAC , Google a sorti un gros modèle de code, CodeGemma , est-ce que ça va vous tuer ? C'est tellement bon qu'il est open source - outil d'édition d'images et d'affiches open source
{{o.name}}
{{m.nom}}

Je suppose que tu aimes

Origine my.oschina.net/u/4925410/blog/11052782
conseillé
Classement