URL: https://linuxfr.org/users/bux-2/journaux/integration-d-une-fenetre-de-debug-live-en-rust Title: Intégration d'une fenêtre de debug live en Rust 🦀 Authors: bux Date: 2023年03月06日T20:28:09+01:00 License: CC By-SA Tags: rust, libre, jeu et architecture Score: 20 J'ai récemment ajouté à un de mes projets open source [une fenêtre de modification en temps réel des paramètres de calcul et de rendus](https://twitter.com/buxofp/status/1621433293328551936). La réalisation de ce travail s'est passée de manière très efficace et sans produire aucun bug. C'est-à-dire qu'une fois compilé, le logiciel n'a présenté aucune défaillance et la fonctionnalité s'est comportée exactement comme attendu. **Du premier coup**. L'objet de ce journal est d'en exposer le contexte. La nature du langage Rust 🦀 ---------------------------- Le projet en question, [un jeu](https://github.com/buxx/OpenCombat), codé en [Rust](https://www.rust-lang.org/). Différents aspects de ce langage ont rendu cette intégration plus aisée. De manière non exhaustive : * [Un typage fort](https://doc.rust-lang.org/reference/type-system.html) : Aucune ambiguïté sur ce que l'on manipule. Lorsque l'on change la signature d'une fonction, tous ses appels sont contrôlés par le compilateur. Rien ne peut planter à l'exécution pour des raisons de type ou de structure. * [Pas de "nulls" incontrôlés](https://doc.rust-lang.org/std/option/) : Là où il peut y avoir un "null" il y a un type spécial (`Option` par exemple). Il est obligatoire de gérer ce type comme tel, c'est-à-dire comme pouvant être `None`. Pas de plantage à l'exécution à cause de "null" non pris en compte. * [Filtrage par motif](https://doc.rust-lang.org/book/ch18-03-pattern-syntax.html) exhaustif + [Énumérés](https://doc.rust-lang.org/book/ch06-01-defining-an-enum.html) : Travailler avec des énumérés associés à du filtrage par motif exhaustif (c'est contrôlé par le compilateur) fais que l'on n'oublie aucune partie du code quand on ajoute/modifie des notions (représentés par des [Énumérés](https://doc.rust-lang.org/book/ch06-01-defining-an-enum.html)) dans le code. L'architecture du jeu --------------------- Qui dit jeu vidéo dit boucle. Lors de chaque itération, est appliqué la suite d'algorithmes du jeu qui lisent "l'état" et produisent une liste "d'opérations" à mener. Ce qui est important ici, c'est que lors de l'exécution de ces algorithmes, "l'état" n'est jamais altéré. L'exécution de ces algorithmes est ainsi parallélisable à souhait (et c'est fait) et il n'y a pas d'ambiguïté sur ce qui pourrait changer dans cet "'état" pendant l'exécution de ces algorithmes. Ensuite, la liste "d'opérations" à mener est traité. Cette partie de code modifie "l'état" du jeu. Cette séparation franche entre la partie "déterminer des changements" et l'application de ces "changements permettent d'éviter les nœuds de logique (là où on ne sait plus quoi est modifié ni quand). Également, toutes les altérations possibles de "l'état" du jeu sont identifiés et listés exhaustivement (à travers des énumérés) : ![Liste des énumérés](https://tracim.bux.fr/api/public/guest-download/184c6316-1aaa-42df-8178-4622a3755832/1_OpenCombat_Enums.png) Nature des changements ---------------------- ### Mutualisation de la configuration Une première étape a été de déplacer les quelques valeurs de configurations qui n'était pas encore dans "l'objet de configuration". Aucune difficultés particulière et aucune régression introduite (grâce aux contrôles de typage, voir "La nature du langage Rust"). ### Intégration de la fenêtre Egui [Egui](https://www.egui.rs/) est une bibliothèque permettant de créer des interfaces graphiques en [mode immédiat](https://github.com/emilk/egui#why-immediate-mode). Par exemple, cette partie-ci de la fenêtre que j'ai intégré : ![Interface egui](https://tracim.bux.fr/api/public/guest-download/1e25e15f-5605-43de-93c6-c1d647ad9d65/2_OpenCombat_egui.png) Est produite par le code suivant : ![egui code](https://tracim.bux.fr/api/public/guest-download/2ae9ef4d-3fa2-466f-baf1-c32dce4b460d/3_OpenCombat_egui_code.png) Ici, la modification de la propriété liée à la configuration correspondante se fait par une référence mutable. Je me le permets (par opposition à la production de liste de "changements") car il n'y a pas de complexité particulière. La fenêtre Egui est construite au fur et à mesure des déclarations de construction. Et le [contrôleur d'emprunt](https://doc.rust-lang.org/1.8.0/book/references-and-borrowing.html) du compilateur de Rust assure qu'il n'y aura jamais de problèmes d'accès concurrents à ces propriétés. Rechargement des ressources graphiques -------------------------------------- Le mécanisme de rechargement d'une ressource graphique pourrait être complexe, car nécessite de remplir le tampon du GPU avec la nouvelle texture. C'est le genre d'opération qui est délicat de faire pendant l'exécution de l'affichage du jeu ou durant l'exécution de la logique du jeu en rapport avec cette texture. L'architecture du jeu (voir "L'architecture du jeu") s'y prête bien : Lorsqu'un changement est constaté sur la fenêtre, un "changement" est ajouté à la liste des changements qui seront exécutés au moment où l'on autorise l'accès par mutabilité à "l'état" du jeu : ![graphics message](https://tracim.bux.fr/api/public/guest-download/dc6c7671-a0f5-425c-bc44-334dd2776e48/4_OpenCombat_graphics.png) Mot de la fin ------------- Cette architecture ainsi que la bonne maintenabilité des codes Rust m'ont permis de faire cette intégration très efficacement et de constater dès la première exécution du code que tout fonctionnait comme attendu. Ce qui est suffisamment satisfaisant pour justifier ce journal :) Depuis j'ai également effectué un important [remaniement de code](https://github.com/buxx/OpenCombat/pull/104) (+8,586 −3,289) dans lequel les parties logiques et affichages du jeu ont été concrètement séparés (voir les [espaces de travail](https://doc.rust-lang.org/book/ch14-03-cargo-workspaces.html) en Rust). Permettant d'une part d'exécuter un serveur de jeu en ligne de commande, mais aussi de mieux identifier les différentes responsabilités du code. Permettant par exemple d'intervenir sur la partie affichage ou effets visuels et sonores sans risquer de modifier la logique de calcul du jeu. Sachez aussi que je travaille pour la société [Algoo](https://www.algoo.fr/fr/), une boîte très impliquée dans le logiciel libre. Si vous envisagez de faire du Rust dans un contexte professionnel, on peut vous accompagner en force de développement, formation ou coaching.

AltStyle によって変換されたページ (->オリジナル) /