战魂小筑

讨论群:309800774 知乎关注:http://zhihu.com/people/sunicdavy 开源项目:https://github.com/davyxu

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  257 随笔 :: 0 文章 :: 506 评论 :: 0 Trackbacks

    朋友催促下,想很快的做出新一版的战魂,并且添加这4年多来自己所有研究出来的高科技!

    对于大量的子弹弹幕和高速微操控制,只有帧同步能解决这个问题,但是中国国内对于帧同步研究的人很少,国外也少见这类文章,甚至用google都很难搜到,难不成是我用错搜索词?

    大学时期曾经看过一本重庆大学出版社出版的游戏编程。基于DX8写的,很基础,里面还记得有王鑫写的帧同步的基本原理。

    这里个人总结下:

  1. 帧同步,顾名思义:就是每一帧都同步,所以就是真同步
  2. 由于数据量巨大,一般使用UDP做发送
  3. 要做到数据的绝对同步,延迟不能太大,最好能在局域网来做,延迟20ms以下
  4. 如果要在公网传输,由于采用的是P2P传输,因此,UDP的打洞也是必不可少的

因此,可以先定下采用的网络库是Raknet(http://www.jenkinssoftware.com/),从网上down了一个下来看视频,还是很强大的,虽然用的项目不是很多。不过用于个人的项目已经足够了。

    Raknet和XNA下的网络库很类似,支持可信赖的UDP发送。由于是自定义的传输方式,同时,没有TCP的负载均衡的复杂算法,因此网络传输速度可以很快

    在游戏中的帧同步,在我的考虑将是这样的:

  1. 游戏中的逻辑帧与渲染帧是不同步的,逻辑帧也许远远低于渲染帧
  2. 对于一个使用elapse值在逻辑控制下移动的物体,这个移动算法必须能被时间插值。
  3. 那么我们将这段时间进行分段,每一段就是一帧。我们为这些帧进行编号,类似于封装TCP协议一样。这些编号更类似于指令号。
  4. 游戏中有一人被作为服务器使用,每个玩家将自己的操作编码成指令后发送给这台服务器,由服务器统一分配序号广播给所有的其他玩家
  5. 对于可以被时间插值的动画轨迹(寻路),那么将发送轨迹(如果寻路算法出来的结果是唯一的,就只需要发送起点跟结尾点)以及每帧更新这个物体的时间插值参数。
  6. 由于外界输入对系统的干扰,才产生了需要同步的数据。外界输入干扰保护用户操作和AI
  7. 考虑到每人的网络ping值的不同,对于特别慢的玩家,可能在其广播指令时,其他玩家已经走出很多步,因此需要计算一个平均ping值,当网络中某人的ping值低于这个值时,将弹出类似于魔兽/星际的同步对话框,等待其本地指令序号赶上其他玩家的序列号
  8. 由于所有物体的移动都可以被时间插值,因此,游戏中的每一逻辑帧,只需要将本地服务器在上一帧的ping值和帧号广播给所有的玩家
  9. 当物体启动和结束移动时广播
  10. 当渲染帧数下降时,将很明显的看到帧同步对象有很明显的"跳跃"现象,这个现象在星际中更是明显。但在技术成熟的魔兽中已经被插值予以替代
posted on 2009-05-14 23:09 战魂小筑 阅读(6836) 评论(0)  编辑 收藏 引用 所属分类: 网络 服务器技术

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理