只是想知道人们有什么技巧可以避免多人游戏中的游戏同步问题以及使用模型视图控制器模式中的模型记录游戏逻辑的重放
到目前为止,我知道在模型之外的任何地方提供对模型的非 const 访问不是一个好主意,但除此之外,我有点卡住并且仍然存在许多同步问题
谢谢
只是想知道人们有什么技巧可以避免多人游戏中的游戏同步问题以及使用模型视图控制器模式中的模型记录游戏逻辑的重放
到目前为止,我知道在模型之外的任何地方提供对模型的非 const 访问不是一个好主意,但除此之外,我有点卡住并且仍然存在许多同步问题
谢谢
要实现分布式同步,您需要一个指定的单一主模型,最好是在单独的游戏服务器上。控制事件到达那个位置,获得时间戳,计算所有发生的交互,并发送带有时间戳的更新事件。重播可以通过存储和重播更新事件来完成。
由于模型在单独的服务器上运行,因此您甚至无法授予视图 const(同步)访问权限。通用 MVC 并不是真正正确的方法,它更多的是:
model -> event stream -> local model -> view
^ |
| v
selector <- action stream <- controller
这两个流绝对是异步的,可能是 UDP,所以有损。
避免多线程,如果有的话,它应该完全本地化在上述组件之一中(例如选择器中的线程池,模型中每个区域一个线程)。
对于很多游戏,出于性能原因,您需要打破该模型并让控制器直接更新本地模型的某些部分(例如,您可以在不插电的情况下在 Wow 中四处走动)。这肯定会导致同步问题,但对于 ping 时间 > 人类反应时间的网络上的实时游戏可能无法避免。
同步是指多线程同步吗?如果是这种情况,我会使用互斥锁。如果你的意思是通信同步,你能解释一下发生了什么吗?