节约网络带宽的设计策略

      网游数据包发送的特点是:每次发送数据的数据量很小,但是频率非常高。

每次发送数据所占带宽越小,给服务器造成的压力也就越小。

      一般用于节约网络带宽的设计策略有:

(1)只发送一次静态数据

      通常在网络应用程序中,服务器将传送一定量的静态数据给客户端。这些数据可能是为3D世界初始化的参数,客户名字,或者一些对象的不变状态常量。网络引擎应该提供一种缓存字符串数据(客户名字、任务描述等等)的机制,只将给定字符串发送一次,以后如果要再次使用该字符串则用一个整数来代表该字符串,这样就减少了传送数据的大小

(2)压缩数据

      网络引擎应提供一种将标准数据类型写出压缩包的机制,将数据的发送量尽可能的减小,比如可以将Boolean值被写成一个比特,整数类型被写成指定比特长度,例如,一个游戏可能用32位整数来发送范围在0到1000000的位置信息,每个位置信息占用17位,但剩下的15位就白白浪费掉了,可以将该整数指定为17个比特进行发送[0,7,8]。float指针值也可以被指定为。到1压缩率的指定比特数量。字符串数据可以通过Huffman方法压缩。这样发送数据时,可大大降低数据量,节约带宽。

(3)只发送与客户端相关的信息

      在C/S模型下,服务器经常有一些信息不是和所有的客户端相关的,比如说,在3D世界中,如果一个物体在一个给定客户端的可见范围之外,对于该客户端,服务器就没有理由开销宝贵的数据包空间去描述这个物体。

      因此网络引擎应该允许应用层轻松的对每个客户端指定哪个物体是与其相关的,或只显示在其视线范围内对象,这样每次更新消息只发送给一部分的客户端,这样也节约了网络的带宽。
(4)消息等级化

      当一个网络充满了大量的数据的时候,网络传输将变得十分困难。客户端拥有的网络条件也是千差万别。对于用于高速光纤网络的用户来说,服务器数据容易到达。而网络条件差的用户(如拨号上网),传输大量的网络数据将十分困难。多人网络游戏必须使得每个用户对等,保持网络游戏应有的平衡性,特别是不能因为网速的优势而获得游戏的优势。消息等级化就是为了解决这个问题而提出的一种解决方法。
      这个方法的核心就在于消息有不同的优先级。例如,对于即时战略玩家来说,敌人的位置消息比自己军队的装备消息更为重要。因此当一个新用户加入游戏时,必须对它的网络情况进行测试,获得带宽数据即每秒能接收的数据量。根据用户的带宽情况,服务器按照优先级顺序发送消息,以确保它能够得到最关键的服务器消息。对要求立刻显示或被更新频率高的对象优先发送,否则稍后发送。在第一人称射击游戏中,消息被划分为以下等级(从高到低):位置消息、射击消息、武器消息、动画消息。每个等级的消息情况可以用“每秒比特量”进行量化,此时服务器可以决定发送消息的级别。因此在一个第一人称射击游戏中,网络情况非常差的用户可能只会得到位置消息的更新,但一定程度上能保证游戏顺利进行。

(5)只更新那些被改变的对象

      通常在网络通信中,不是所有的对象状态在同一时间更新,比如说一个玩家在3D游戏中有如下的状态:玩家的当前位置,速度,健康值和弹药。如果这个玩家移动,只有位置和速度的状态将被改变,因此发送所有的状态包括健康值和弹药的值,将浪费不必要的空间。又例如,同一场景下,当一个玩家的位置小范围内移动的信息对另一个玩家无关紧要,则可以不同步该玩家的位置信息给另一个玩家。因此网络引擎应该提供一种机制,允许独立的,区分于其它对象的方式更新每个对象的状态。

       


 

posted @ 2011-05-19 15:10  红脸书生  阅读(2497)  评论(0编辑  收藏  举报