serialization - 通过MessageBox输入数据?

标签 serialization ipc deserialization dart game-engine

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

所以在我的情况下:

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

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

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

    我想知道这种设计有多好?连接上的每个数据都会进行JSON序列化和反序列化。我很担心这带来的开销,这个 channel 将被大量使用。

    有什么我可以做来改善的吗?

    最佳答案

    几种可能性:

  • 发送类型数据列表是否有效? VM应该能够在隔离之间传输类型化的数据列表。不知道dart2js如何处理。
  • 将二进制数据和base64编码为String进行传输。这将比纯二进制数据(增加1.2倍的空间)的压缩程度稍差,但可以使用。

  • 约翰

    关于serialization - 通过MessageBox输入数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17784739/

    相关文章:

    c# - 在 C# 中从 base64 反序列化对象

    java - 如何根据关键字将解析的 JSON 消息的内容存储到字符串变量中?

    c# - 将对象列表转换为 json 数组

    c# - 使用 IPC 在 Python 和 C# 之间进行通信的最简单方法?

    linux - 如何在 zmq(本地套接字)中获取调用者 pid

    java - 将文件中的对象读取到数组列表中

    java - 在android studio上反序列化xml文件

    json - 如何自定义将 JAXB 对象列表序列化为 JSON?

    C# 有没有办法动态地从序列化中排除成员?

    c++ - dll到主程序通信