没有 Rust,就没有这款游戏引擎
这篇文章是由安德烈斯·弗朗哥撰写,记录了他使用 Rust 开发游戏引擎以及制作完成这款游戏并最终上线的心路历程。在文章开篇,作者强调:
这并非是对其他游戏引擎的批评。我不是说“我的引擎更好,你的引擎不好”,而是“现有的引擎不太符合我的需求,所以我想走自己的路”。不同的人,不同的时间,可能会有不同的结果,这完全没问题。
最初,作者希望开发一款支持以下特性的多人游戏引擎:
- 支持2名或更多玩家;
- 实时、响应迅速的动作类玩法(非回合制);
- 玩家间高度互动(如技能、状态相互影响);
- 能在高延迟(如跨大洲)网络下稳定运行。
这些需求排除了大多数传统同步方案,最终选择了基于回滚(rollback-based)的网络同步模型,并采用服务器权威 + 客户端回滚的架构(不同于传统P2P格斗游戏的回滚方式)。
选择 Rust 的原因
- 确定性保障:
- 使用 fixed-point 替代浮点数,避免跨平台浮点运算不确定性;
- 定点数支持完全排序、无 NaN/Infinity,提升调试安全性。
- 可复现的随机数:
- 通过 rand_pcg crate 轻松实现跨平台确定性随机,仅需一行依赖。
- 简洁高效的序列化:
- 借助 serde + bincode,网络消息的编码/解码极其简单可靠。
- 内存安全与性能兼顾:
- 自研轻量 ECS 系统,使用
Cell
/RefCell
实现内部可变性,牺牲部分并行性换取开发效率与确定性; - Rust 的零成本抽象和高效克隆(配合
clone_from
优化)显著提升回滚性能。
- 自研轻量 ECS 系统,使用
- 网络层实现便捷:
- 自定义基于 UDP 的可靠有序消息协议,支持分片、ACK、心跳等;
- 甚至解决了 Windows 平台上 UDP 的“虚拟连接重置”怪异行为。
实际效果
在模拟网络条件下测试:
- 20ms RTT:几乎无感;
- 70ms RTT:轻微回滚,仍流畅;
- 140ms RTT(如美欧之间):明显但可玩,未达不可接受程度。
原文:https://blog.vermeilsoft.com/2025-09-rust-game-engine/
模式匹配进阶
在文章中,作者列绝了模式匹配的几种场景,以及几种进阶技巧。并给出了一些最佳实践:
- 性能考虑:
- 对于非简单类型(如字符串、复杂条件),将高频或更具体的分支放在前面
- 简单
enum
或整数匹配由编译器优化为跳转表,顺序无关
- 优先使用
match
而非if/else
处理enum
:- 获得编译器的穷尽性检查和更好优化
- 一次性解构多个字段:
- 避免重复访问,提高可读性与意图明确性
- 用
matches!
做布尔判断:- 比单臂
match
更简洁,如matches!(opt, Some(42))
- 比单臂
模式匹配是贯穿 Rust 的核心机制,掌握 ref
、@
、守卫、切片模式等技巧,能显著提升代码表达力。
在平时开发中,应合理选择模式(let
vs if let
vs match
)和结构,兼顾性能与可维护性。
Sguaba: 类型安全的空间数学库
大约一个月前,Jon Gjengset 在阿姆斯特丹 Rust 线下聚会上做了一场关于 Sguaba (一个类型安全的空间数学 Rust crate)的演讲,现场视频已经发布到 YouTube:
https://www.youtube.com/watch?v=kESBAiTYMoQ
--
From 日报小组 Yuan YQ
社区学习交流平台订阅:
评论区
写评论还没有评论