【Rust日报】2020-08-11 “群集”引擎:数据驱动的游戏引擎和应用框架

2020-08-17 14:43:10 浏览数 (1)

“群集”引擎:数据驱动的游戏引擎和应用框架

独立游戏开发者卡特·安德森发布了群集引擎(Bevy引擎)。这个引擎能用于开发游戏和应用程序,它是免费的开源项目。它的架构充分地利用了Rust语言模块化、速度和开发周期短的特点,可以跨平台、三维渲染,相比竞品,它的编译时间更短,功能更丰富。

本次发布引擎的文章给出了性能测试的简单报告。在迭代速度方面,群集引擎比其它项目都要快一到两倍;在世界准备方面,群集引擎超过竞争品的平均值。这要归功于群集引擎的工程设计——它将相同类型的组件内存紧压在一起,提高程序的空间局部性,从而提高处理器缓存的效率。它还使用了无锁并发的开发模式,提高并行计算的速度。

文章还给出了大量的示例代码,来展示群集引擎的基本使用方法。针对传统的“实体——组件——系统”(ECS)思想,群集引擎扩展出线程本地系统、多队列、过滤器等开发模式,而且给出了更适合Rust语言的编写方式。群集引擎的开发使用了特殊的“函数系统”写法,可以在用户给定的任何函数指针上扩展函数,从而方便地包装任意函数到引擎需要的编程对象。这是通过为函数扩展函数,返回一个装箱好的结构体来实现的。

文章还给出了图形界面的简单应用。在平面图形方面,绝对和相对位置、父子关系、流式排版、文字图形和可交互事件等常见的平面设计元素,都是被这个引擎兼容的。这款引擎很好地支持游戏开发常见的“精灵表单”概念。它也支持立体图形的复杂模块、平滑锯齿等等高级特性。一个非常好的功能是,这款引擎能动态重载场景,这尤其适合快速开发和需要更换材质包的场合。

群集引擎还包括游戏音效等等诸多功能模块。另外,它针对快速编译也有特殊的修正。未来,它还将支持安卓、iOS、网页等等平台。“群集”的名字来自开发者对引擎发展的期望,希望未来它能吸引更多的开发者,扩展自己的社区。这款引擎已经有详细的文档,作者卡特·安德森希望更多的游戏开发者都加入到群集引擎的生态里来。

https://bevyengine.org/news/introducing-bevy/

初创公司Meili投入150万欧元,探究Rust语言编写的开源搜索引擎

Meili SAS是2018年11月成立的初创公司,希望能开发一套搜索引擎接口,替代当前的托管式云搜索引擎竞争品。本次他们从LocalGlobe、Seedcamp、Kima & Tiny.vc几个投资机构融资150万欧元,希望能建设开源搜索引擎MeiliSearch的社区,以吸纳更多的用户和贡献者。MeiliSearch是一款高效开源的全文搜索引擎,值得一提的是,它也使用社区的汉字分词库“结巴”,对汉字词语的搜索支持有特殊的设计。

与竞品Algolia等等不同的是,MeiliSearch是开源项目。为了举例子,这个引擎在官网给出了一个快速的crates.io搜索引擎,它的搜索和呈现过程加起来仅需数毫秒,几乎可以做到输入字母的同时就已经搜索完毕。这个项目最初是路易威登公司在巴黎赞助的黑客松活动诞生的。没错,就是卖时尚手包的那家路易威登公司——那次活动结束后,项目的三位作者分别获得了一个路易威登的包包作为奖品。

MeiliSearch社区已经公开了后续开发的路线图。他们希望扩展更多的功能,而且能在任何地方快速搭建开发环境。这个社区也非常欢迎开发者的贡献,重视开源社区的价值。

https://blog.meilisearch.com/meili-fundraise/

Rust与单页面网页应用

网页汇编(WebAssembly)是常见的网页编程方式,十分之九以上的浏览器都支持它。本篇文章里,作者尝试搭建只有一个网页、一两行JavaScript代码的网页应用。这样的应用应该只在一个页面里加载内容,就可以访问多个模块,而不需要页面刷新,能复用多个网页的用户交互模块,还能同时更新不同层次的用户页面。作者给了出这种前提下的设计方法,还提供一个设计好的网购网站作为例子。

完成整个开发流程,需要安装Rust和它与网页汇编相关的工具链。文章挑选了Rust语言的yew项目作为开发框架,将网购的商品、购物车、交互信息等等都抽象成Rust语言的结构体和枚举类型,最终完成开发目的。每次用户交互,都会通过一个特殊的“生命圈”方法传给状态机,最终状态机将重新绘制用户界面,达到更新用户界面的目的——比如按下加入购物车的按钮,侧边栏的总价信息将会相应改变。

本篇文章的开发方法中,初始化部分的信息也是由接口提供的。后端服务将访问后续的结构,得到所有的信息,通过应用程序接口和消息结构返回,如果出错也会给出错误的类型。不同的页面之间通过层次结构相互关联,但不同层次的结构共同维护一个全局状态存储空间,以给出数据同步的解决方案。在文章的例子里,所有页面共享同一个购物车内容,这是通过全局状态实现的。状态还可以提升到不同的层级,比如提高侧边栏页面的状态,我们就能在所有页面同时显示一个相同、统一的侧边栏。

文章使用了yew社区提供的大量方便的抽象设计,这和Rust语言灵活的宏系统是分不开的。虽然文章给出的设计方法仍有一定提升空间,作者也在探究问题的解决方案,他希望将来这能作为流行的Vue、React等网页设计框架的替代品。

http://www.sheshbabu.com/posts/rust-wasm-yew-single-page-application/

《异步求生》:Rust语言异步开发与调试技巧

Rust语言的异步(async)特性是非常棒的,一旦异步代码出现情况,我们可以用更好的方法处理错误,也有相应的方法完成调试、测速过程。文章详细描述了Rust异步开发里常见的几个工具,包括如何让错误提示更漂亮;还有一些异步开发常见的问题,包括相同的任务是否曾被传送到不同的线程执行。这些方法对调试Rust异步代码都是相当有帮助的。

https://fasterthanli.me/articles/surviving-rust-async-interfaces

0 人点赞