J'ai donc décidé de parler de la bibliothèque que j'ai écrite récemment. Peut-être que quelqu'un vous sera utile.
Il s'agit d'un framework Rust 2D pour le rendu directement dans Linux Frame Buffer / dev / fb0.
La tâche consistait à afficher de simples scènes 2D sur l'écran / la télévision du Raspberry Pi. Le Raspberry Pi s'exécute sous le contrôle du compilateur sans tête personnalisé YoctoProject Linux. Les gestionnaires de fenêtres sont manquants, tout comme OpenGL. Seul le tampon de trame reste.
Dans le cas de Frame Buffer, chaque pixel doit être traité. Comme j'écris principalement pour GoLang pour Raspberry Pi, j'ai décidé d'écrire une bibliothèque sur Go. J'ai rapidement réalisé que Go n'était pas adapté à mes performances. Il ne pouvait pas effectuer des opérations massives avec de la mémoire dans un délai raisonnable.
Ensuite, j'ai remarqué Rust, qui a effectué des tests similaires beaucoup plus rapidement.
Ainsi, la bibliothèque est développée sur Rust. Comme c'est mon premier projet à Rust, ne donnez pas grand-chose, mais les commentaires sont les bienvenus.
Comme dans toute bibliothèque 2D, il existe trois entités principales: les scènes, les nœuds et les sprites.
Une scène est un conteneur d'objets visuels. Un nœud est un objet virtuel doté de certaines propriétés, telles que l'emplacement, la taille, etc. Les nœuds peuvent être imbriqués.
Chaque nœud contient un objet visuel, le soi-disant sprite. Les sprites se présentent sous plusieurs formes. Les sprites comme RectSprite, TextureSprite, TextSprite sont désormais pris en charge.
RectSprite - un rectangle d'une certaine couleur. ColorS RectSprite est généralement utilisé pour regrouper d'autres nœuds enfants. RectSprite correspond à la balise XML < box >
TextureSprite - un objet pour rendre une image. Seul PNG (RGBA) est actuellement pris en charge. TextureSprite correspond à la balise XML < image >
TechSprite - un objet pour le rendu d'une ligne de texte dans la police et la taille sélectionnées. Il existe un support automatique pour RTL. TechSprite correspond à la balise XML < text >
En plus des attributs d'emplacement et de taille, chaque nœud possède des attributs de gravité et d'ancrage. Cela permet de positionner précisément l'objet à l'intérieur d'un autre objet. Tous les attributs liés à la taille et à l'emplacement sont définis en pourcentage du nœud parent. Cette approche vous permet d'obtenir la meilleure mise à l'échelle sur des écrans de différentes tailles et proportions.
Il est possible de créer une scène, soit par programme, soit de créer un fichier xml décrivant la scène.
Un moyen logiciel pour créer et exécuter une scène.
let mut fb = fb2d::screen_writer_for_framebuffer("/dev/fb0")?; fb2d::set_graphics_mode(); let mut scene = fb2d::scene::Scene::new(); let background_sprite = RectSprite::new(); let background_node = Node::new_rect_node(FLOAT_RECT_FULL, background_sprite); let sprite1 = RectSprite::new(); let mut node1 = Node::new_rect_node( FloatRect { pos: FLOAT_POS_ZERO, size: FLOAT_SIZE_HALF, }, sprite1, ); node1.anchor_point = ANCHOR_POINT_TOP_LEFT; let sprite2 = TextureSprite::new_for_texture("image.png"); let mut node2 = Node::new_texture_node( FloatRect { pos: FLOAT_POS_ZERO, size: FloatSize { width: 0.7, height: 0.7, }, }, sprite2, ); node2.anchor_point = ANCHOR_POINT_CENTER; let mut sprite3 = TextSprite::new(); sprite3.text = String::from("Hello, World !!!"); sprite3.gravity = GRAVITY_CENTER; sprite3.height = 0.2; let node3 = Node::new_text_node( FloatRect { pos: FLOAT_POS_ZERO, size: FLOAT_SIZE_FULL, }, sprite3, ); scene.add_node(node2, node1.key); scene.add_node(node1, background_node.key); scene.add_node(node3, background_node.key); scene.set_root_node(background_node); scene.writer = Some(Box::new(fb)); scene.run();
- Création d'une scène à l'aide d'un fichier XML.
<scene color="#ffa500"> <box pos="0" size="95% 95%" anchor-point="0.5 0" color="#F0C0C0C0"> <text pos="0 -40%" size="100% 10%" anchor-point="0.5 0" height="100%" text="שלום Hello " font="Times New Roman.ttf" color="red"/> </box> <box pos="0%" size="25% 25%" anchor-point="0 1" color="olive" alpha="0.5"> <image pos="0" size="100% 100%" anchor-point="0 1" image="image1.png" /> </box> </scene>
Une scène est créée en pointant vers un répertoire ou un fichier zip contenant scene.xml. Les fichiers d'image et de police dépendants doivent se trouver dans ce répertoire ou fichier zip.
match fb2d::scene::Scene::new_from_bundle("assets/scene1") { Ok(mut scene) => { let mut fb = fb2d::screen_writer_for_framebuffer("/dev/fb0")?; fb2d::set_graphics_mode(); scene.writer = Some(Box::new(fb)); scene.run(); } Err(e) => eprintln!("Error: {:?}", e), }
Un exemple de l'image résultante.
Il est possible de rendre un cadre dans un fichier PNG pour le débogage.

Dépôt GitHub.
Toute aide (contribution) est appréciée. Il y a beaucoup de travail pour optimiser le rendu et ajouter de nouvelles fonctionnalités comme l'animation.