天天看点

ECS + lockstep 实现实时同步

最近在公司用 Lua 写战斗逻辑,对ECS这套结构理解 比以前深刻了很多。脱离开公司业务 之后,我自己又在 unity 里用 C# 实现 了一套 ecs的结构, 写了一小 demo . 在 ECS 的 结构下 , 业务扩展变得非常 灵活, 因为旧有代码逻辑导致新功能不好实现的情况 也变得很少了。ECS思维方式,实在太适合写游戏战斗逻辑了。

用了这套结构写了一个 demo 之后,我又尝试在它的基础上,加上 lockstep 的机制 ,实现局域网 实时同步。 之前一直在做这样的尝试 , 搞起来很吃力。没想到 这次搞起来非常 顺利。 客户端是 unity + c# , 服务器用的 C# + socket 。 网络通信模块并没有使用 c# 封装的 tcp 相关 的类库,而是用 的 socket 层的 api ,更贴近 c++ socket 的写法。

这次的顺利实现,主要要归功于以下 几点:

  1. 客户端的逻辑采用 ECS 结构 ,代码灵活清晰
  2. 服务器使用 C# 的 socket 接口,易用性上 比 C++ 简单
  3. 服务器 socket 通信采用 了 select 和 poll 的方式,比开启大量线程业务处理要简单清晰
  4. 成功解决了 TCP 字节流的粘包 、半包问题

经历了一番努力之后,之前一直梦寐以求的 lockstep 帧同步,终于实现成功了。看着多个机器之间 完美同步,非常有成就感。

代码仓库贴在这里:

https://gitee.com/ayy730/AirKnight

clone 下来之后,里面的 EBB 文件夹 是 unity 客户端项目, ebbs 是 c# 服务器项目 。 为了防止现在的 成果被改坏 ,我 打了个 tag ,名字叫 base_lock_step_code

socket 相关的状态还没有处理太干净。 先把代码 贴在这里,给将来的 自己想找代码参考时,留个方便 。

今天在这发个博客,算是给 自己实现了局域网实时 同步做个纪念,具体实现细节和注意点,有空再逐一进行总结