c++ - 使用 MVC 模式避免多人游戏和重播中的同步问题的提示

标签 c++ model-view-controller multiplayer

只是想知道人们有什么技巧可以避免多人游戏中的游戏同步问题以及使用 Model View Controller 模式中的模型从游戏逻辑中记录下来的重播

到目前为止,我知道在模型之外的任何地方授予对模型的非 const 访问权限不是一个好主意,但除此之外我有点卡住并且仍然有一些同步问题

谢谢

最佳答案

要实现分布式同步,您需要一个指定的单一主模型,最好是在单独的游戏服务器上。控制事件去那里,获得时间戳,计算所有发生的事情的交互,并发送时间戳更新事件。只需存储和重放更新事件即可完成重放。

由于模型在单独的服务器上运行,您甚至不能为 View 提供常量(同步)访问权限。通用 MVC 并不是真正正确的方法,它更像是:

model -> event stream -> local model -> view
^                             | 
|                             v
selector <- action stream <- controller

这两个流肯定是异步的并且可能是 UDP,所以有损。

避免多线程,如果有的话,它应该完全局限于上述组件之一(例如,选择器中的线程池,模型中每个区域一个线程)。

对于很多游戏,出于性能原因,您需要打破该模型并让 Controller 直接更新本地模型的某些部分(例如,您可以在拔下互联网连接的情况下在 Wow 中四处走动的方式)。这肯定会导致同步问题,但对于 ping 时间 > 人类 react 时间的网络实时游戏来说,这可能无法避免。

关于c++ - 使用 MVC 模式避免多人游戏和重播中的同步问题的提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1081764/

相关文章:

c++ - 如何在C++中定义数组的数组

c++ - Rcpp并行: Converting CharacterMatrix to RMatrix<T>

authentication - auth0 的 userInfo 中缺少 user_metadata

java - Libgdx 多人数据管理

c++ - 如何在没有 Nvidia DLL 的情况下调试 OpenCV 程序?

c++ - 如何编写带有自定义标志的 ostream 运算符

swift - _ : mean in Swift? 是什么

javascript - AngularJS Controller 返回表单

android - Google Play 服务实时多人消息

Java套接字,简单的多人游戏,发送数据