当前位置:  开发笔记 > 编程语言 > 正文

星际争霸和帝国时代等实时战略游戏的协议如何?

如何解决《星际争霸和帝国时代等实时战略游戏的协议如何?》经验,为你挑选了1个好方法。

我对协议(和游戏循环)如何适用于这些类型的游戏感兴趣; 任何指针或见解表示赞赏.

我猜主循环会有一个世界状态,每秒会提前几个"滴答",但是玩家的命令是如何执行的?什么样的数据需要来回传递?



1> Jeff Tucker..:

我可以详细介绍这个问题,但首先请阅读"1500弓箭手" http://www.gamasutra.com/view/feature/3094/1500_archers_on_a_288_network_.php,这将回答您的许多问题.以下是摘要:首先,由于游戏的实时性,大多数游戏都使用UDP.游戏循环看起来像这样:

    读取网络数据

    进行客户端预测,并与网络所说的对象实际应用的位置进行比较

    混乱物理学来捏造网络所说的本地游戏状态

    根据您执行此帧的操作将数据发送回网络(如果有的话)

    给予

这大大简化了,"乱搞物理"本身就很容易成为一本200页的书,但它涉及预测客户端可能存在的东西,从旧的服务器获取数据,但确切地告诉对象是/应该在哪里是,然后以某种方式插入这些值,使对象看起来"足够接近",实际上应该是没有人注意到的地方.这对于第一人称射击游戏来说非常关键,但对于实时战略来说并不是那么重要.

对于实时策略,通常发生的是基于回合的系统,其中时间被划分为称为"转弯"的谨慎块,其顺序发生,并且每个转弯具有由单调函数生成的数字,其保证在特定顺序中不断增加的值.重复.在任何给定的转弯n上,每个客户端都会向所有其他客户端发送一条消息,并在转向n + m处执行其预期的操作,其中m是一个通常相当小的任意数字,可以通过试错和游戏测试来最好地确定.一旦所有客户端都发送了预期的操作,每个客户端都会执行在转n + m时发送的所有操作.这引入了用户在执行操作时以及执行操作时的微小延迟,但这通常并不明显.

有几种技术可以用来捏造时间.例如,如果你高亮一个单位然后告诉它移动,它会发出声音,并在它开始移动时有一个动画,但实际上不会立即移动.然而,当屏幕响应播放器的输入时,立即发送意图移动该单元的网络消息,网络消息已经被发​​送和确认.您可以通过在鼠标单击和游戏对象的响应之间引入一个小延迟(100ms左右)来进一步捏造它.玩家通常不会注意到这一点,但在局域网游戏中100ms是永恒的,即使在家用电脑上使用宽带连接,平均ping也可能在15-60ms左右,这使您有足够的时间发送数据包.此举.

对于要发送的数据,游戏中有两种类型的数据:确定性和非确定性.确定性动作以游戏物理为基础,因此当动作开始时,我可以100%保证可以预测该动作的结果.这个数据永远不需要通过网络发送,因为我可以根据初始状态确定它在客户端上的内容.请注意,在每个客户端上使用具有相同种子的随机数生成器会将"随机"事件转换为确定性行为.非确定性数据通常是用户输入,但在许多情况下可以预测用户的输入可能是什么.在实时策略游戏中这些对的方式是非确定性事件是我的一个游戏对象的某种顺序.一旦游戏对象被命令移动,它移动的方式是100%确定性的.因此,你需要在网络上发送的只是对象的ID,给出的命令(使其成为节省带宽的枚举),以及命令的目标(如果有的话,所以如果一个咒语是一个咒语可能没有目标affet的区域,但移动命令有一个终点目的地).如果用户单击100次以使单元移动,则不需要为每次单击发送单独的移动命令,因为它们都在同一个通用区域中,所以一定要过滤掉它,因为它会杀死你的带宽.

处理命令与其执行之间可能的延迟的最后一个技巧是称为局部感知过滤器.如果我在订单发出后的某个时间收到搬家订单,我知道该单位应该何时开始搬运,我知道它的最终目的地.我没有传送单元来使它达到应有的位置,而是可以延迟开始它的运动,然后使用物理技术来轻微加速它以便它可以赶上它应该到达的位置,然后将其放慢速度.把它放在正确的地方.加速它所需的确切值也是相对的,并且游戏测试是确定正确值的唯一方法,因为它必须"感觉正确"才能使其正确.你可以用发射子弹和导弹做同样的事情,这对它非常有效.这样做的原因是人类在看到运动的细微变化方面并不是非常擅长,特别是如果一个物体直接朝向它们或远离它们,所以它们只是没有注意到.

接下来要考虑的是减少带宽.不要向无法查看正在移动的单元或与之交互的客户端发送消息.不要因为用户点击而一遍又一遍地发送相同的消息.对于没有立即影响的事件,请勿立即发送消息.最后,如果事件未能收到,则不要求对过时的事件进行确认.如果我没有获得移动更新,那么当我重新传输该更新时,它的值将会很老,以至于它不再相关,所以最好只发送另一个移动并使用本地感知过滤器来赶上或使用一个三次样条曲线,用于插入运动,使其看起来更正确或具有某种性质.但是,如果需要,应该承认并重新发送一个至关重要的事件,例如"你已经死了"或"你的旗帜已被采取".我在Digipen教网络游戏编程,所以随时可以提出任何其他问题,因为我可能会给你一个答案.网络游戏编程可能相当复杂,但最终都是在实施中做出选择并理解您选择的后果.


+1该死的有趣读物,即使是像我这样的非游戏玩家.
推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有