Mutli Player游戏同步

use*_*184 7 iphone synchronization multiplayer

情况:

我想问一下,使用BT或Web服务器在多人1:1游戏中同步对象的最佳逻辑是什么.游戏中有两个玩家,每个玩家都有多个枪支和子弹,子弹是动态创建的并且在一段时间后消失,我的移动玩家同时移动.

问题:

我有一个真正的同步问题,因为一个设备上的子弹可能比其他设备更快,也可能已经消失或击中一个设备上的一个对象,而另一个设备仍然在空中.

可能性?

在这种情况下,处理同步的最佳方法是什么?如果所有对象都由一个充当服务器的设备控制,而另一个只是获取值,位置并且做很少的思考.或者应该控制分布在每个设备创建的位置,销毁并移动自己的对象,然后通过同步告诉其他设备.

在这方面处理传输延迟的最佳方法是什么,因为BT可能比通过网络播放更快?最好的是一个工作样本 - 非常感谢!

Jef*_*tes 10

你似乎已经开始了一些关于同步的好主意,但是你可能遇到两个重叠的问题:游戏时钟的同步和游戏状态的同步.

(1)同步游戏时钟你需要为你的游戏代表"游戏时间".对于2人游戏,简单地声明一个权限是非常合理的.

所以在权威客户端:

OnUpdate()
  gameTime = GetClockTime();
  msg.gameTime = gameTime
  SendGameTimeMessage(msg);
Run Code Online (Sandbox Code Playgroud)

在另一个客户端可能是这样的:

OnReceivGameTimeeMessage(msg)
 lastGameTimeFromNetwork = msg.gameTime;
 lastClockTimeOfGameTimeMessage = GetClockTime();

OnUpdate()
 gameTime = lastGameTimeFromNetwork + GetClockTime() - lastClockTimeOfGameTimeMessage;
Run Code Online (Sandbox Code Playgroud)

有一些复杂的问题,比如跳过/滑倒(即从网络中获取太多前进/后退的时间)需要进一步的工作,但希望你能得到这个想法.如果您需要,请跟进另一个问题.

注意:此示例不区分"ticks"与"秒",也不区分您的网络协议,也不依赖于您的游戏运行的设备类型(保存要求'设备具有本地时钟').

(2)在拥有一致的游戏时钟后同步游戏状态,你仍然需要弄清楚如何一致地模拟和传播你的游戏状态.为了同步游戏状态,你有几个选择:

异步

  • 每个游戏状态单元由一个进程"拥有".只允许该进程更改该游戏状态.这些更改将传播到所有其他进程.
  • 如果一切都由一个进程拥有,这通常被称为"客户端/服务器"游戏.
  • 请注意,使用此模型,每个客户端都可以随时拥有不同的游戏世界视图.
  • 示例游戏:地震,魔兽世界

为了优化带宽和隐藏延迟,您通常可以对具有高更新频率的字段进行一些本地模拟.例:

drawPosition = lastSyncPostion + (currentTime - lastSyncTime) * lastSyncVelocity
Run Code Online (Sandbox Code Playgroud)

当然,在这种情况下,您必须与模拟版本协调新信息.

同步

  • 游戏状态的每个单元在所有进程中都是相同的.
  • 来自每个进程的命令以其期望的启动时间(将来某个时间)传播到彼此.
  • 在最简单的形式中,一个进程(通常称为主机)发送特殊消息,指示何时推进游戏时间.当每个人收到该消息时,他们可以在此之前模拟游戏.
  • "未来"要求导致输入命令和游戏状态更改之间的高延迟.
  • 在像文明这样的非实时游戏中,这很好.在像星际争霸一样的游戏中,通常声音确认输入会立即出现,但影响动作的实际游戏状态会延迟.这种风格不适合需要时间敏感动作的射击游戏(约100毫米).

与resimulation同步

  • 游戏状态的每个单元在所有进程中都是相同的.
  • 每个进程使用其当前时间戳向其所有其他进程发送其输入.另外,定期发送"没有发生"的消息.
  • 每个进程都有2个游戏状态副本.
  • 游戏状态的副本1传播到它从所有其他客户端收到的"最后最早的消息".这相当于同步模型,但它有一个弱点,它代表了一段时间以来的游戏状态
  • 游戏状态的副本2是副本1加上所有剩余的消息.假设没有新的事情发生,它是对客户端当前时间的游戏状态的预测.
  • 玩家与两个游戏状态的某些组合进行交互(理想情况下,100%副本2,但必须采取一些措施以避免在新消息进入时弹出)
  • 示例游戏:街头霸王4(网络游戏)

根据您的描述,选项(1)和(3)似乎适合您的问题.如果您还有其他问题或需要更多细节,请再次询问.