首页 > 代码库 > [转贴] 网络游戏实时动作同步方案手记(3)

[转贴] 网络游戏实时动作同步方案手记(3)

出处 http://blog.csdn.net/akara/article/details/5936744

(2)网上根本找不到,我也试图私信过原作者询问,没有回复。

------------------------------------------------------

基于上面的(1)(2)两篇同步方案知识,可以写个demo来试验同步的效果。

  需要找一个p2p库来做系列同步算法的demo。选了RakNet-4.0.Beta5。
  官方网站是http://www.jenkinssoftware.com/
  RakNet提供了如下基于UDP的信道功能:
  > 丢包重发
  > 高效包排序
  > 包数据安全性保证,自动发现并报告被修改的包
  > 流控制和包合并
  > ....
  在频繁发送大量大体积数据包的情况下,可能选择RakNet并不高效;
  但对于选用RakNet制作游戏而言,你总可以优化发送频率和体积。
  RakNet的SDK文档和Demo丰富,接口友好,跨平台,自用免费,商用收费(贵)。

  要实现同一副本游戏中各peer间互联,可以用RakNet提供的几种方法:
* 所有Peer在同一局域网内,可进行预定义指令广播来发现peer,
  接到指令的peer来请求连接对方。

* 针对互联网上的普遍情况互联,则要建立几种服务器来实现NAT穿透:

  > Directory Server
    提供每个副本游戏独立的peers信息表(由其中各peer自己先行提交),
    信息表中包含各peer的ip:port,guid等信息,而每个peer在网络帧中对
    Directory Server的新peer信息进行处理并向NATPunchthroughServer发起
    穿透NAT的请求。
 
    Directory Server在RakNet中有几种形式的实现:
    (1)SQLite plugin
    (2)lobby server
    (3)PHP Directory Server
    可以随便选一种,但写demo简单起见,用PHP Directory Server。
    更方便的是有一个官方的PHP Directory Server可以直接用:)

  > NAT类型检测Server
    写Demo暂时不建立这个服务。大多数NAT还是可穿透的。

  > NATPunchthroughServer
    提供NAT穿透服务。即所说的UDP打洞(Punching)技术。
    打洞的大致原理网络上有很多很好的文章可以查阅。
    因为对port的映射方式和持续方式不同,并不是所有的NAT类型都可以穿透。
    具体的NAT类型和是否可以穿透的关系如下表:
    
    据一些调查报告称国内存在约5%的NAT不可穿透。
    但一些P2P VOD的实践者称不可穿透的NAT比例在15%左右。
    所以当peer间无法进行NAT穿透时,UDPProxyCoordinator + UDPProxyServer
    便是终极方案,虽然成本增加,但forwarding总不会有事。
    
  > UDPProxyCoordinator
    UDPProxyServer管理器。一个UDPProxyCoordinator可接多个UDPProxyServer,
    它负责指派UDPProxyServer的信息给peer进行UDP转发,
    也监控各UDPProxyServer的负载情况做负载均衡,
    UDPProxyServer可以动态挂接添加到UDPProxyCoordinator上。
    挂接UDPProxyCoordinator时需要输入UDPProxyCoordinator的挂接密码认证。
  
  > UDPProxyServer
    负责UDP包转发。开发者可以按负载需求增添UDPProxyServer的数量。

---------------------------------------------------------------------

  以上的互联结构在我的搭建方案中大致如下图:

 

[转贴] 网络游戏实时动作同步方案手记(3)