查看原文
其他

@9.23 GOSIM Workshop 上海 | 可能是史上最强 Rust 游戏引擎 Bevy 首秀

张汉东 觉学社 2024-01-01

本文联合作者:周亮/张汉东

今年(2023)九月份将在上海举办首届的 GOSIM Workshop (9.23-24)[1] 和  GOSIM Conference (9.26)[2]  盛会。GOSIM 会场将支持「同声传译」,小伙伴们可以放心购票参与。还不了解 GOSIM 大会的朋友,可以参考文章结尾的详细介绍。

本次 GOSIM Workshop 游戏与元宇宙分论坛请来了 Rust 开源游戏引擎中的 知名项目 Bevy 核心维护者 Alice 来给大家做精彩分享。在参加 Workshop 之前,你应该对 Bevy 游戏引擎有一定了解。通过本文你将了解 Bevy 最新状态、学习 ECS 架构。

Bevy介绍

本章节作者:周亮,前游戏行业老兵,从PHP干到MR,目前精力投入Bevy中。

bevy logo

Bevy[3] 是一个rust构建的以ECS架构为核心的数据驱动免费开源游戏引擎,目前在Github有26K的star, 并且是Github第二大受欢迎的游戏引擎(Rust游戏引擎排名第一)[4]。在今年8月初bevy刚刚过了它的三周岁生日,它年轻,优雅、活力十足。

在市面上已经有很多成熟的引擎,比如UnrealEngine[5]Unity[6]Godot[7]Cocos2d[8]等等,那为什么Bevy还会出现呢?作者解释了原因[9],其中有几个原因深得我心:

自由和开源

它必须是自由和开源的,_没有任何附加条件_。游戏是我们文化的重要组成部分,人类_正在为游戏_开发投入数百万小时。为什么我们(作为游戏开发者/引擎开发者)继续建立闭源垄断的生态系统,这些垄断企业削减了我们的销售额,并剥夺了我们对日常使用的技术的可见性?作为一个社区,我相信我们可以做得更好。这个标准消除了虚幻和Unity,尽管它们的功能集很大。

最近Unity新的收费模式[10]引起了业内震动,按安装量付费是对中小型开发者是一笔额外负担。而 Bevy 使用了MIT和APACHE2的双协议授权, 对使用者十分友好。

Turtles All The Way Down[11]

理想情况下,引擎是用与游戏相同的语言编写的。能够对游戏中的符号运行 IDE“转到定义”命令并直接跳转到引擎源代码是一个非常强大的概念。您也无需担心繁重的语言翻译层或有损抽象。如果引擎的社区使用与引擎相同的语言构建游戏,他们更有可能(并且能够)为引擎做出贡献。

正如Unreal开发语言是C++, Unity和Godot开发语言是C#,Bevy是纯正的Rust开发的游戏引擎。如果你是rust爱好者,可以从bevy项目中学习到很多知识,比如说如何实现Rust反射[12]。如果你是游戏引擎爱好者,可以跟随者Bevy的社区,从RFC的讨论到模块落地实现,学习游戏引擎知识。

简单

它需要易于用于常见任务,但也不能向您隐藏细节。许多引擎要么“易于使用但级别太高”,要么“级别很低但难以完成常见任务”。此外,Rust 中的许多引擎都充斥着生命周期和泛型。诚然,两者都是强大的工具,但它们也会带来认知负担并降低人体工程学。如果您不小心,泛型也会对编译时间产生巨大影响。

很多时候生命周期和泛型是rust新手的拦路虎,Bevy考虑到了这些,日常使用时隐藏了这些细节,很容易上手。

数据驱动

需要数据驱动/数据导向/数据优先。ECS 是执行此操作的常见方法,但它绝对不是唯一的方法。这些范例可以使您的游戏更快(缓存友好,更容易并行化),但它们也使游戏状态序列化和同步等常见任务变得非常简单。

如果你对ECS(实体、组件、系统)模式有兴趣, Bevy所有的引擎逻辑和业务逻辑都是基于Bevy ECS[13]进行数据驱动, ECS的API也在不停进化中,更快、更易用。

Bevy 社区

好,那么Bevy发展前景怎么样?会不会和Amethyst Engine[14]一样进入发展停滞期?

Bevy社区组织分为以下几种角色

  • 项目负责人
  • 维护者
  • 领域专家

首先先要介绍一下Bevy的缔造者@cart[15],他熟悉Unreal、Unity、SDL、Three.JS等框架,并用Godot开发了4年游戏。Bevy发布后, cart辞去微软高级开发工程师的工作, 全职投入了Bevy的开发。目前cart作为团队的BDFL(终身仁慈独裁者[16])、负责核心引擎开发、指导项目方向和管理社区。

然后除了cart外,还有4位维护者@james7132[17]@alice-i-cecile[18]@superdump[19]@mockersf[20]。还有更多的领域专家和贡献者,可以在这里查看[21]

Bevy 社区已经达成了共识, 使用RFC流程管理项目,同时从Bevy 0.6开始使用三个月滚动的时间点来发布版本。Bevy上个月刚刚发布了0.11版本,基本上3个月多一个版本,基本完成了计划。

@alice-i-cecile 作为技术项目经理、疯狂科学家和文档主管,负责起草、完善和评论有助于构建 Bevy 基础架构的RFC[22],,最近刚刚发布了一篇blog[《充分利用开源热情-按争议分类和社区审查》(https://www.leafwing-studios.com/blog/triage-by-controversy/)],分享了Bevy社区的治理经验。这次开源创新大会(_GOSIM_ 2023)@alice-i-cecile会作为演讲嘉宾来到现场,分享《Taffy: Bringing a Dead Dependency Back to Life Through Open Source》。Taffy作为bevy_ui的依赖库,之前已经被遗弃多年,她将介绍如何利用开源技术分叉、修复和维持这个复杂的库。

Bevy ECS

今年Bevy 刚刚完成了ECS Schedule V3[23], 实现了”无阶段“调度RFC[24]

Bevy 一直将ECS的人机工程学放在首位:

系统(system)的调度

app
    .add_systems(Startup, (a, b))
    .add_systems(Update, (c, d, e))
    .add_systems(FixedUpdate, (f, g))
    .add_systems(PostUpdate, h)
    .add_systems(OnEnter(AppState::Menu), enter_menu)
    .add_systems(OnExit(AppState::Menu), exit_menu)

运行条件判断

app.add_system(move_player.run_if(is_alive.or_else(is_zombie)))

查询过滤

use bevy_ecs::prelude::*;

#[derive(Component)]
struct Position { x: f32, y: f32 }
#[derive(Component)]
struct Player;
#[derive(Component)]
struct Alive;

// 查询有Player组件且没有Alive组件的Position组件
fn system(query: Query<&Position, (With<Player>, Without<Alive>)>) {
    for position in &query {
    }
}

Bevy + WebGPU[25]

Bevy 今年已经正式的支持了WebGPU渲染[26], 在这里可以到很多在线示例[27];

Bevy 构建于wgpu[28]库之上,wgpu 库是一种现代低级 GPU API,可以针对几乎所有流行的 API:Vulkan、Direct3D 12、Metal、OpenGL、WebGL2 和 WebGPU。

一些渲染例子

社区作品

fish-folk[29]2d多人联机射击游戏,目前已经在Kickstarter[30]筹集资金成功

bevy-inspector-egui[31]基于egui的编辑器

Velo[32]在线头脑风暴和分享想法

Bevy目前的不足

缺乏文档和例程

Bevy 目前还在高速发展中,API还没有稳定,官方的文档更新不够及时,基本是查看example代码或者社区写的CheatBook[33], 新手上手需要一定的时间。

ECS 模式的理解成本

ECS 模式对抽象能力有一定要求,需要一定的时间上手,但熟悉后对业务解耦较好,容易扩展。

社区资源

很多引擎功能(如镜头控制)目前还需要第三方插件提供,功能也不一定能满足生产要求,今年(2023年)也不会有游戏编辑器。。。,

Bevy ECS 架构介绍

本章节作者:张汉东

ECS,即 「Entity Component System」,一般被翻译为 「实体组件系统」。ECS 中的 「实体(Entity)」、「组件(Component)」和 「系统(System)」都是相互平行的概念,不要理解为是由实体和组件而组成的系统。ECS 架构很早就被提出了,因为暴雪公司的 《守望先锋》这款游戏应用了 ECS 架构而被广泛讨论,在 Unity 游戏引擎中也支持了 ECS 架构。

ECS 架构是一种面向数据的编程模式,它的出现主要是为了解决游戏开发中因为面向对象而导致的性能瓶颈。

《守望先锋》Gameplay 团队在 2017 年分享过一个解决复杂的网络同步问题的例子。

在现实世界中,每个主体观察一颗树的角度是不同的:园丁会关注茂密程度、鸟儿会关注可供栖息的树枝、白蚁会关注可供筑巢的根基。如果用面向对象来表达这棵树,它的Update函数可能就很奇怪,园丁要对它更新,鸟儿要对它更新,白蚁也要对它更新。但是对于 ECS 架构则不会有这种耦合。

ECS的数据只是一种值,没有任何行为,完全是纯数据,这使得系统可以非常方便地进行快照以及回滚操作。这一点对于网络同步系统来说,可以减少很多复杂度。在《守望先锋》这样的射击游戏中,状态预测是非常重要的,假如服务器的延迟比较大,客户端有时需要预测玩家的输入,才能使高延迟的时候的玩家行为表现地平滑。如果客户端预测失败了,则需要对客户端进行状态的回退。对于ECS来说,只需要memcpy就能回退到上一个快照的状态,非常方便。

ECS 架构中的概念:

  • 实体(Entity):表示游戏世界中某个实体,具体在代码中,它用一个唯一 ID 来表示。
  • 组件(Component):用于存储数据。同类型的组件存储是紧密排列的,这种方式有助于提升CPU缓存命中率。可以说,组件只是数据,不包含任何方法行为。
  • 系统(System):用于存储行为。同时,系统中不包含任何数据,不包含任何状态。系统中使用的数据,是通过依赖注入的方式传入的。

从 Bevy 非官方指南一书中看到对于理解 ECS 非常有帮助的一个心智模型:把 ECS 与数据库表进行类比。比如 Health 组件,游戏中的不同实体,都可以有 Health。

实体(E)组件(C)系统(S)
玩家Health值走路
NPCHealth值走路

建立这样一个模型,对 ECS 的认识就更加直观形象了,也能理解 ECS 是面向数据开发的含义了。这种模型也使得游戏逻辑非常灵活和可重用。

P.S 类比,是一个非常好的学习方法。类比可以帮助你把陌生的概念和你已经熟知的概念建立一种奇妙的映射,帮助你理解。

也请注意,实体不仅限于“游戏世界中的对象”。ECS 是一种通用数据结构,你可以创建实体和组件来存储任何数据。所以也有人将 Bevy 用于非游戏项目中。

重要警示:使用 Bevy ECS 架构请忘记面向对象思想。

既然 ECS 可以类比为数据库表,那么数据库表可以通过 SQL 来查询指定字段的行数据,那么 Bevy ECS 如何使用呢?

Bevy ECS 中的术语解释

在通过阅读游戏源码学习 Bevy 应用之前,我们需要排除一些障碍:Bevy 中专用术语带来的学习阻碍。

Bevy 框架中有一些专用的术语,我们需要先了解它们所代表的意思:

  • App ,是定义 Bevy 项目的构成的基本结构。它包含了 ECS World 和 ECS Shedule 。
  • World,是 Bevy ECS 存储所有数据和相关元数据的地方,它跟踪 资源、实体和组件。
  • 资源(Resources),是用于存储某种数据类型的单个全局实例,与实体无关。你可以理解为定义和存储全局变量的地方。任何 Rust 类型都可以用做资源。
  • 实体,只是用来标识一组特定的组件值,用简单的整数 ID 表示,就像是数据库表里的主键 ID。实体使用 Commands[37] 来进行管理。
  • 组件,是和实体关联的数据。以数据库表类比的方式理解,同一个实体,可以关联多个组件;同一个组件,也可以关联多个实体。(多对多关系)。注意,一个实体每个 Rust 类型只能有一个组件。只要实现 Component trait 即可创建一个组件。Bundles 就像是组件模版,允许创建具有一组通用组件的实体。
  • 系统(System),系统是开发者编写的任意函数,由 Bevy 运行时来执行。但是这些函数必须采用特殊的参数类型(SystemParams)。这里有一种 约定大于配置 的感觉了。除了开发者定义的, bevy 也有内置的系统函数,允许开发者访问资源、创建实体和组件、查询组件、接收事件等。
  • 查询(Query),既然可以将 ECS 类比为数据库表,那么如何查询表数据呢?数据库表使用 SQL,那么 bevy ECS 里使用的就是查询( Query)。比如使用查询可以查指定实体的组件,你是不是想到select components from entity-id
  • 插件(Plugin),插件是用于模块化管理项目的方式。
  • 状态(State),允许开发者构建应用程序的运行时“流程”。
  • Stage,Bevy 运行的所有系统[38]都包含在 stage 中。每次帧更新,Bevy 都会按顺序执行每个stage。在每个stage,Bevy 的调度算法可以并行运行多个系统,使用多个 CPU 内核以获得良好的性能。
  • Schedule,以线性顺序运行的 stage 容器。

案例学习

本文就以打字游戏源码为案例进一步熟悉 Bevy ECS 的应用。

我们参考Bevy Jam[39] 游戏开发第一次比赛中的一个打字游戏[40],来学习 Bevy ECS 的应用实践,从而为后面阅读 ECS 库源码打基础。这款游戏模仿的是 《Flappy Bird》(飞扬的小鸟)这款游戏,但是控制小鸟上下飞是通过打字完成的。

![[bird.png]] 如果让你来实现这个游戏,你会如何去进行代码设计呢?

最先肯定会想到整个游戏背景,小鸟往前飞,背景往后移动这样的场景。所以我们需要一个 Ground。

这个Ground是一个组件,因为它就是一个地图数据。但是在玩家启动游戏以后,小鸟是可以无限往前飞的,如果要达到这个效果,让背景图上的素材,比如树木、水管往左移动就可以了。而小鸟只需要在原地上下移动即可。

所以,Ground 组件还需要一系列实体,就是那些素材。

在游戏启动的时候,需要生成游戏背景地图,以及让背景地图向左移动,这些都是行为逻辑,所以是 system。

我们就可以得出下面这张表。

实体(E)组件(C)系统(S)
水管Groundground_movement()/ spawn_ground()
树木Groundground_movement()/ spawn_ground()

通过案例学习你是不是对 ECS 更加容易理解呢?

该游戏的源码在 GitHub 开源[41], 目前已经升级到 Bevy 最新版本 0.11,可以参考源码来学习 Bevy ECS。

游戏与元宇宙 Rust Workshop  日程介绍

9.24 Rapier 物理引擎 、Bevy 数据驱动引擎 和 Croquet

  • 《Rapier:分布式物理模拟的第一步》,由 Rapier[42] 作者 SÉBASTIEN 带来的分享 。Rapier 是一个功能强大的开源物理引擎,专为 Rust 设计。它拥有先进的 2D 和 3D 物理模拟,是游戏开发、机器人和动画项目的绝佳选择。本次分享将重点探讨元宇宙的分布式物理仿真。我们将讨论克服可能出现的具有挑战性的数值问题的设计和策略。
  • 《Bevy:认真对待实体-组件-系统架构(ECS)》,来自 Bevy[43] 的工程师 Alice 分享。实体-组件-系统(Entity-Component-System,ECS)架构通常用于游戏中,以加快令人尴尬的并行、计算繁重的任务。但是,如果我们认真对待人体工程学(和扩展),它就会成为一个强大而富有表现力的复杂逻辑框架,借鉴数据库、调度和依赖注入的精华。和我一起探索领先的 Rust 游戏引擎 Bevy 如何回答 "如果全部采用 ECS 会怎样?
  • 《用 Croquet 制作下一代多人游戏》,Croquet[44] 作者 David 带来分享。可以理解为是一个元宇宙 OS,它使用了 Rapier,支持 Web 和 Unity。它消除了传统客户端/服务器系统的复杂性,无需网络代码,实现了前所未有的同步模拟和游戏。

GOSIM 介绍

GOSIM(Gobal OpenSource Innovation Meetup) 全球开源创新汇[45] 是由 WasmEdge Runtime 创始人 Michael Yuan 和 CSDN 创始人兼董事长蒋涛共同发起的开源社区平台。

在这个数字时代,障碍不断被打破,视野持续拓展,GOSIM 为所有开源爱好者照亮了前行的道路。这不仅仅是一个聚会,更是一场变革。通过促进全球合作,多样化技术生态,并分享无与伦比的知识,GOSIM 不仅正在塑造开源的现在,更是锻造其未来。对于那些坚信开源力量,认为它有潜力重新定义技术界限的人,GOSIM 正在召唤您。加入这场运动,成为开源变革的一部分。

GOSIM 由以下三大支柱组成:

  • GOSIM 大会(Conference):每年举办一次的这场会议是开源领域各个领域思想的汇聚之地。无论您是策略师、架构师、研究者,还是仅仅是一名开源爱好者,GOSIM 会议都为您提供了一个深入探索开源技术趋势、策略、治理和最佳实践的机会。
  • GOSIM 工作坊(Workshop):这是理论与实践相结合的地方。作为一个年度盛会,GOSIM 工作坊全面致力于实践行动 —— 开源项目设计、代码开发、黑客马拉松、竞赛以及深入讨论。这是专为那些希望积极塑造开源未来的项目领导者、开发者和维护者量身定制的活动。
  • GOSIM 开源驿站(Fellowship):除了每年的聚会,GOSIM 的核心是其全年无休的奖学金项目。这是一个持续的计划,支持开源项目的开发,得到了赞助者和资助的大力支持。‍

小结

研发游戏引擎的人总有一点理想主义,Bevy作者@cart从微软离职后,全职投入Bevy游戏引擎开发,收入全来自捐赠者, 目前每月金额已经达到离职前的2/3。当我看到该消息时,心里就觉得Bevy稳了,有那么多人看好Bevy的发展,值得投入精力去学习, Let's Bevy!

在这两天的 COSIM Workshop 中,你能通过亲自参与以及亲手开发来了解 Rust 语言在这些科技领域中如何发挥着它的作用。作为 Rust 爱好者,你还犹豫什么呢?需要购票的小伙伴可以去官网[46]购票,票价低至 99 元(学生票)。

除了 Workshop 之外,也别忘记关注  GOSIM Conference (9.26)[47]  盛会,也会有 Rust 相关的精彩议题。

参考资料

[1]

GOSIM Workshop (9.23-24): http://workshop2023.gosim.org/

[2]

GOSIM Conference (9.26): https://conference2023.gosim.org/

[3]

Bevy: https://bevyengine.org/

[4]

Github第二大受欢迎的游戏引擎(Rust游戏引擎排名第一): https://github.com/topics/game-engine

[5]

UnrealEngine: https://www.unrealengine.com/

[6]

Unity: https://unity.com/

[7]

Godot: https://godotengine.org/

[8]

Cocos2d: https://www.cocos.com/

[9]

原因: https://bevyengine.org/news/introducing-bevy/#why-build-bevy

[10]

收费模式: https://36kr.com/p/2430419547083142

[11]

Turtles All The Way Down: https://en.wikipedia.org/wiki/Turtles_all_the_way_down

[12]

如何实现Rust反射: https://zhuanlan.zhihu.com/p/615577638

[13]

Bevy ECS: https://github.com/bevyengine/bevy/tree/main/crates/bevy_ecs

[14]

Amethyst Engine: https://amethyst.rs/

[15]

@cart: https://www.github.com/cart

[16]

终身仁慈独裁者: https://zh.wikipedia.org/wiki/%E7%BB%88%E8%BA%AB%E4%BB%81%E6%85%88%E7%8B%AC%E8%A3%81%E8%80%85

[17]

@james7132: https://github.com/james7132

[18]

@alice-i-cecile: https://github.com/alice-i-cecile

[19]

@superdump: https://github.com/superdump

[20]

@mockersf: https://github.com/mockersf

[21]

查看: https://bevyengine.org/community/people/#the-bevy-organization

[22]

RFC: https://github.com/bevyengine/rfcs

[23]

ECS Schedule V3: https://bevyengine.org/news/bevy-0-10/#ecs-schedule-v3

[24]

”无阶段“调度RFC: https://github.com/bevyengine/rfcs/blob/main/rfcs/45-stageless.md

[25]

Bevy + WebGPU: https://bevyengine.org/news/bevy-webgpu/

[26]

WebGPU渲染: https://caniuse.com/webgpu

[27]

在线示例: https://bevyengine.org/examples-webgpu/

[28]

Bevy 构建于wgpu: https://github.com/gfx-rs/wgpu

[29]

fish-folk: https://github.com/fishfolk/jumpy

[30]

Kickstarter: https://www.kickstarter.com/projects/erlendsh/fish-folk

[31]

bevy-inspector-egui: https://github.com/jakobhellermann/bevy-inspector-egui

[32]

Velo: https://github.com/StaffEngineer/velo

[33]

CheatBook: https://bevy-cheatbook.github.io/

[34]

Bevy官网: https://bevyengine.org/

[35]

Discord社区: https://discord.gg/bevy

[36]

Bevy Cheat Book: https://bevy-cheatbook.github.io/

[37]

Commands: https://docs.rs/bevy/0.8.0/bevy/ecs/system/struct.Commands.html

[38]

系统: https://bevy-cheatbook.github.io/programming/systems.html

[39]

Jam: https://itch.io/jam/bevy-jam-1

[40]

打字游戏: https://euclidean-whale.itch.io/typey-birb

[41]

GitHub 开源: https://github.com/rparrett/typey_birb

[42]

Rapier: https://rapier.rs/

[43]

Bevy: https://bevyengine.org/

[44]

Croquet: https://croquet.io

[45]

GOSIM(Gobal OpenSource Innovation Meetup) 全球开源创新汇: https://www.gosim.org/

[46]

官网: https://workshop2023.gosim.org/

[47]

GOSIM Conference (9.26): https://conference2023.gosim.org/


继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存