勤奋不止 / 客户端移动 / 网络游戏同步法则 - ShaHuShaBoJue的专栏 ...

0 0

   

网络游戏同步法则 - ShaHuShaBoJue的专栏 - CSDN博客

2011-03-06  勤奋不止
网络游戏同步法则 收藏
网路的硬件也有限,而人的创造也无限,在公网平均130ms的Latency下,是不存在“完全的”的同步情况。如何通过消除/隐藏延时,将用户带入快速的交互式实时游戏中,体验完美的互动娱乐呢?
 
以下六点,将助你分清楚哪些我们可以努力,哪些我们不值得努力,弄明白实时游戏中同步问题关键之所在,巧妙的化解与规避游戏,最终在适合普遍用户网络环境中(200ms),实现实时快速互动游戏:
 
1. 基本情况:
   (A) 网络性能指标一:带宽,限制了实时游戏的人数容量
   (B) 网络性能指标二:延时,决定了实时游戏的最低反应时间
 
2. 两个基本原则:
   (A) 让所有的用户屏幕上面表现出完全不同的表象是完全没有问题的。
   (B) 把这些完全不同表象完全柔和在一个统一的逻辑中也是完全没有问题的。
 
3. 同步的十二条应对策略:
   (A) 最大可能减少游戏中的数据传输
   (B) 将阻塞通信放到线程池中实现
   (C) 永远不要为了等待某个数据而不让游戏进行下去
   (D) 利用预测和插值改进游戏的效果
   (E) 当使用预测插值的时候传送的数据不仅包括坐标,还需要速度和加速度
   (F) 将输入数据枷锁或者队列化(例如键盘消息队列),直到下次发送数据的时刻,传统的方法是在固定的时间(发送数据前)检测键盘,在游戏的原理上隐藏延时
   (G) 使用事件调度表,将需要在所有用户客户端同时发生的事件,提前广播到所有用户
   (H) 使用多次攻击来杀死一个精灵,尽量减少一次性的、确定性的、延时敏感的事件
   (I) 延长子弹或者火箭在空中飞行的时间(在其飞行的同时,在所有客户端进行预测插值)
   (J) 所有物体从一个地方移动到另外一个地方都需要时间,避免诸如“瞬间移动”的设计
   (K) 尽量使游戏中所有精灵,飞船或者其他物体,都按照可预测的轨迹运行,比如在移动中增加惯性
   (L) 充分发挥创造力,尽最大可能的合并游戏中前后相关的事件,合并游戏中存在的延时此问题,需要在技术上改进的同时也需要策划有所重视,规避一些影响较大的设计,巧妙的隐藏"延时"
 
4. 同步问题现状:
   (A) 重视程度不够:很多人尚未意识到此问题的存在,曾有公司花半年时间打算做一款“松鼠大战”的网络版。
   (B) 技术上无彻底解决方案:对于多数程序员,单机游戏技术善未成熟就匆匆步入网络时代。
   (C) 研究这个技术需要条件:需要有实力的公司才能提供,无此条件,即便有能力的程序员也无法成功。
 
5. 目前网游的三大技术难题:
   (A) 服务器的响应问题:如何使服务器在支持越来越多的人数的情况下提供最高的响应。
   (B) 同步问题:如何在有限的网络响应情况下,实现快速实时类游戏,提供最完美的交互。
   (C) 服务器分布式问题:如何在统一用户数据的情况下,利用分部式将各个分散的“世界”统一到一个“世界”中。
   谁能真正解决好以上三个问题,配合策划在设计上的突破,将使其他人在至少两年内无法超越。
  
6. 相关补充:
   (A) 网格技术现在还是抄作,真正用到游戏中,还有很多技术难点需要突破(比如:目前网格的单位计算时间是以秒计算).
   (B) 其实与很多人想法相反的是现在3D技术早已不是主要的矛盾。而现在国内外对于以上三个问题可以说处于同一个起跑线上,完全有机会取得先机。
   (C) 现在解决同步问题已经很紧迫,而同时所需要的环境也已经成熟,只要有所关注,半年之内可以得出较成熟的结论
 
 
那么具体怎么解决呢?再下一步怎么办?
这就得自己去实践了,我只说这么多了,哈哈,不然又教懒了那些成天再网上搜方案的人。
 
1 游戏中的行走,则是一个需要同步的重头戏,当今游戏分成两种同步方式,一种是以服务器端为准,如果发现客户端的坐标和服务器的坐标不符合的话,则拉回。这点的好处是可以弥补瞬移外挂的出现,但在网络环境差的情况下,则出现游戏不流畅。
所以,我比较推荐使用以客户端计算为准的方法(当然是我因为我这个游戏对游戏流畅性要求很高),客户端向服务器发送计算好的数据,服务器经过一定的预测判断,广播给其他玩家,这个虽然是能引起和wow一样的问题,瞬移外挂,但完全可以从游戏设计方面进行根本避免。(这里就不谈策划方面的问题了)
2 游戏的战斗,战斗的同步性要求也相当高,这里我也引用楼主说的,在固定时间检测键盘,以一定频率发送攻击消息,这里有一个关键,就是服务器和客户端都进行攻击判定,即使服务器中没有攻击判定成功,但在客户端判定成功,也要播放攻击效果。不过一切计算效果以服务器为准。这是一个欺骗玩家的手段。
补充: 键盘的队列化:我并没有在游戏中加入队列化的东西,一切消息都是即时发出的,最多采取在固定时间检测键盘,以一定频率发送消息。因为玩家突然行走,或者突然攻击,队列化是一点帮助都没有的,去掉这方面的设计,可以减少一定的开发时间。
人行走:MMO中如果是鼠标点击行走传目的地+中间寻路接点就行了,服务器简单验证一下。如果是键盘控制行走的话,需要做简单的预测插值。
打怪:要看怎么个打法,客户端根本不必管服务端什么时候传来消息,直接演示动画就行了,最好把被砍的过程动画做长一点,可以在播放动画的过程中等待服务器传过来的延迟敏感事件,比如--该人已死。这样处理起来比较容易。
插值:所谓“把不同表象柔和在一起”算法很多,简单的可以参考DR,位置不同的时候可以做一次线性插值,直接把人拉扯过去,或者二次线形插值,做一条平滑的曲线修正,看具体项目选择了。
时钟:就是时钟同步,所有时钟都是以“贞”为单位的,服务器主逻辑循环可以是5-10fps,多则无益,客户端同样维持一个和服务端频率相同的消息同步贞。
时间贞:把ping值加到时间计算里面是多余的,按贞计算的话,服务端告诉客户端在n贞发生xx事件的时候,客户端收到的时候如果客户端贞数大于n,说明是发生过了的,那么做插值,如果小于n,说明是未来发生的,那么加入时间表。
还有其他一些:魔法,特效,飞行武器。。。。具体得看你游戏怎么样设计的了。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ShaHuShaBoJue/archive/2011/02/02/6171877.aspx

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。如发现有害或侵权内容,请点击这里 或 拨打24小时举报电话:4000070609 与我们联系。

    猜你喜欢

    0条评论

    发表

    请遵守用户 评论公约

    类似文章
    喜欢该文的人也喜欢 更多