我正在考虑编写一个基于 Dart 的浏览器游戏。我喜欢将核心游戏逻辑与客户端渲染和事件处理代码分开。这样我就可以在多人系统中的服务器 Dart VM 端运行相同的逻辑代码。这就是当今许多游戏(例如 Quake 系列)所做的事情:即使您玩单人游戏,您也有一个本地服务器。
所以在我的场景中:
- 事件处理和渲染在主浏览器线程上运行(渲染循环由requestAnimationFrame触发)
- 游戏逻辑在单独的Isolate中运行(实际上是浏览器中的一个WebWorker )
- 对于通信,我使用的是MessageBoxes,它的设置和管理有点麻烦,但这是可能的。如果逻辑在服务器上运行,这可以稍后与 WebSocket 交换。
逻辑隔离向主线程循环发送有关游戏事件的消息(如游戏对象的状态正在更新、地图更改等),主线程将客户端事件(基于按键的玩家移动、命令)发布到逻辑。
我想知道在这一层上管理消息的最佳方法是什么。来自 MessageBox 的文档:“消息的内容可以是:原始值(null、num、bool、double、String)、IsolateSinks 的实例以及其元素是其中任何一个的列表和映射。” 这些都适用于简单的数据传输,但如果我想传递整个数据 bean 怎么办?我发现的唯一解决方案是 JSON 序列化,可以使用JsonObject相对轻松地完成。现在我们有了一个可以通过 MessageBox/WebSocket 传递的字符串。
我想知道这个设计有多好?连接上的每个数据都会发生 JSON 序列化和反序列化。我害怕这会带来开销,这个频道会被大量使用。
我能做些什么来改善这一点吗?