2

我正在考虑编写一个基于 Dart 的浏览器游戏。我喜欢将核心游戏逻辑与客户端渲染和事件处理代码分开。这样我就可以在多人系统中的服务器 Dart VM 端运行相同的逻辑代码。这就是当今许多游戏(例如 Quake 系列)所做的事情:即使您玩单人游戏,您也有一个本地服务器。

所以在我的场景中:

  • 事件处理和渲染在主浏览器线程上运行(渲染循环由requestAnimationFrame触发)
  • 游戏逻辑在单独的Isolate中运行(实际上是浏览器中的一个WebWorker )
  • 对于通信,我使用的是MessageBoxes,它的设置和管理有点麻烦,但这是可能的。如果逻辑在服务器上运行,这可以稍后与 WebSocket 交换。

逻辑隔离向主线程循环发送有关游戏事件的消息(如游戏对象的状态正在更新、地图更改等),主线程将客户端事件(基于按键的玩家移动、命令)发布到逻辑。

我想知道在这一层上管理消息的最佳方法是什么。来自 MessageBox 的文档:“消息的内容可以是:原始值(null、num、bool、double、String)、IsolateSinks 的实例以及其元素是其中任何一个的列表和映射。” 这些都适用于简单的数据传输,但如果我想传递整个数据 bean 怎么办?我发现的唯一解决方案是 JSON 序列化,可以使用JsonObject相对轻松地完成。现在我们有了一个可以通过 MessageBox/WebSocket 传递的字符串。

我想知道这个设计有多好?连接上的每个数据都会发生 JSON 序列化和反序列化。我害怕这会带来开销,这个频道会被大量使用。

我能做些什么来改善这一点吗?

4

1 回答 1

1

几种可能性:

  1. 发送键入的数据列表是否有效?VM 应该能够在隔离之间传输类型化的数据列表。不确定 dart2js 如何处理事情。
  2. 获取您的二进制数据并将其 base64 编码为字符串以进行传输。这将比纯二进制数据(空间增加 1.2 倍)稍微不那么紧凑,但会起作用。

约翰

于 2013-07-25T18:14:17.573 回答