就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、参考资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,访问帮助中心 /help/reopen-questions 以获得指导。
我正在构建一款在线多人台球游戏,并且正在努力思考多人物理模拟的最佳方法。我想到了三种可能的方案,每种方案都有自己的优点和缺点,我想听听那些已经实现了类似功能或具有多人在线游戏经验的人的一些意见。
第一个场景: 客户端上的物理模拟:击球的玩家依次将击球角度和力量发送到服务器,服务器用这些值更新所有客户端,以便它们可以独立模拟击球。
优点:
服务器过热程度低
缺点:
同步问题。无论帧速率如何,客户端都必须进行精确的模拟。 (可以用一些聪明的算法来解决,就像所描述的那样here http://gafferongames.com/game-physics/fix-your-timestep/ )
作弊。玩家可以通过调整物理引擎来作弊。 (可以在击球结束时与其他球员的球位置进行比较时确定。如果桌上只有两名球员(即不引人注目),那么谁是作弊者?)
第二种情况:
在一个(即“主”)客户端(例如,谁进行射击)上进行物理模拟,然后将每个物理步骤广播给其他所有人。
优点:
同步没有问题。
缺点:
1.服务器过热。每个时间步骤“主”客户端都会将所有球的坐标发送到服务器,并且服务器必须将它们广播给房间中的其他人。
2.“高手”玩家作弊的可能性仍然存在。
第三种情况: 物理现象将在服务器上进行模拟。
优势:
由于模拟是独立于客户端运行的,因此不可能作弊。
没有同步问题,一次模拟意味着每个人都会看到相同的结果(如果由于网络延迟而不同时发生事件)
缺点:
服务器超载巨大。服务器不仅必须每秒为每张桌子计算 30/60 次物理数据(可能同时有 100 张桌子),而且还必须向房间中的每个人广播所有坐标。
EDIT 一些与我正在制作的游戏类似的游戏,以防有人熟悉他们如何克服这些问题:
http://apps.facebook.com/flash-pool/
http://www.thesnookerclub.com/download.php
http://gamezer.com/billiards/
我认为第三个是最好的。
但是,如果您在将服务器中的所有碰撞和移动发送到客户端之前计算它们(每次碰撞和移动等),那么您可以做得更好,然后客户端只需“执行”它们即可。
如果这样做,每次拍摄只需发送一次信息,这将大大减少网络问题。
正如 JimR 所写,您应该使用速度或运动方程,而不是一步一步进行增量模拟(如龙格库塔方法)
服务器发送给客户端的信息如下所示:
Blackball hit->move from x1,y1 to x2,y2 until time t1
Collision between blackball and ball 6 at time t1
Ball 6 -> move from x3,y3 to x4,y4 until time t3
Blackball -> move from x5,y5 to x6,y6 until time t4
Collision between Ball 6 and Ball 4 at time t3
and so on until nothings move anymore
此外,您可能需要一堆表示不同物理方程的类,并有办法序列化它们以将它们发送到客户端(Java 或 C# 可以轻松序列化对象)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)