因此,我决定介绍一下我最近编写的库。 也许有人会派上用场。
这是一个Rust 2D框架,可以直接在Linux Frame Buffer / dev / fb0中进行渲染。
任务是在Raspberry Pi的屏幕/电视上显示简单的2D场景。 Raspberry Pi在YoctoProject自定义无头Linux编译器的控制下运行。 缺少窗口管理器以及OpenGL。 仅保留帧缓冲区。
对于帧缓冲器,必须处理每个像素。 由于我主要在GoLang中为Raspberry Pi编写程序,因此我决定在Go中编写一个库。 我很快意识到Go不适合我的演奏。 他无法在合理的时间内执行大量的内存操作。
然后我注意到Rust,它可以更快地执行类似的测试。
因此,该库是在Rust上开发的。 由于这是我在Rust中的第一个项目,因此不要花费太多,但欢迎发表评论。
像在任何2D库中一样,存在三个主要实体:场景,节点和子画面。
场景是视觉对象的容器。 节点是具有某些属性(例如位置,大小等)的虚拟对象。 节点可以嵌套。
每个节点都包含一个可视对象,即所谓的精灵。 精灵有几种形式。 现在支持诸如RectSprite,TextureSprite,TextSprite之类的Sprite。
RectSprite-特定颜色的矩形。 无色RectSprite通常用于对其他子节点进行分组。 RectSprite匹配XML标签< box >
TextureSprite-用于渲染图片的对象。 当前仅支持PNG(RGBA)。 TextureSprite与XML标签< image >相匹配
TechSprite-一个对象,用于以选定的字体和大小呈现一行文本。 对RTL有自动支持。 TechSprite对应于XML < text >标记
除了位置和大小属性外,每个节点还具有重力和锚点属性。 这有助于将对象准确定位在另一个对象内。 与大小和位置有关的所有属性均设置为父节点的百分比。 这种方法使您可以在不同大小和比例的屏幕上实现最佳缩放。
可以通过编程方式创建场景,也可以创建描述场景的xml文件。
创建和运行场景的软件方法。
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();
- 使用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>
通过指向包含scene.xml的目录或zip文件来创建场景。 依赖的图像和字体文件必须位于此目录或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), }
所得图像的示例。
可以在PNG文件中渲染帧以进行调试。

GitHub存储库。
任何帮助(贡献)表示赞赏。 有很多工作可以优化渲染,并添加新功能,例如动画。