朋友催促下,想很快的做出新一版的战魂,并且添加这4年多来自己所有研究出来的高科技!
对于大量的子弹弹幕和高速微操控制,只有帧同步能解决这个问题,但是中国国内对于帧同步研究的人很少,国外也少见这类文章,甚至用google都很难搜到,难不成是我用错搜索词?
大学时期曾经看过一本重庆大学出版社出版的游戏编程。基于DX8写的,很基础,里面还记得有王鑫写的帧同步的基本原理。
这里个人总结下:
- 帧同步,顾名思义:就是每一帧都同步,所以就是真同步
- 由于数据量巨大,一般使用UDP做发送
- 要做到数据的绝对同步,延迟不能太大,最好能在局域网来做,延迟20ms以下
- 如果要在公网传输,由于采用的是P2P传输,因此,UDP的打洞也是必不可少的
因此,可以先定下采用的网络库是Raknet(http://www.jenkinssoftware.com/),从网上down了一个下来看视频,还是很强大的,虽然用的项目不是很多。不过用于个人的项目已经足够了。
Raknet和XNA下的网络库很类似,支持可信赖的UDP发送。由于是自定义的传输方式,同时,没有TCP的负载均衡的复杂算法,因此网络传输速度可以很快
在游戏中的帧同步,在我的考虑将是这样的:
- 游戏中的逻辑帧与渲染帧是不同步的,逻辑帧也许远远低于渲染帧
- 对于一个使用elapse值在逻辑控制下移动的物体,这个移动算法必须能被时间插值。
- 那么我们将这段时间进行分段,每一段就是一帧。我们为这些帧进行编号,类似于封装TCP协议一样。这些编号更类似于指令号。
- 游戏中有一人被作为服务器使用,每个玩家将自己的操作编码成指令后发送给这台服务器,由服务器统一分配序号广播给所有的其他玩家
- 对于可以被时间插值的动画轨迹(寻路),那么将发送轨迹(如果寻路算法出来的结果是唯一的,就只需要发送起点跟结尾点)以及每帧更新这个物体的时间插值参数。
- 由于外界输入对系统的干扰,才产生了需要同步的数据。外界输入干扰保护用户操作和AI
- 考虑到每人的网络ping值的不同,对于特别慢的玩家,可能在其广播指令时,其他玩家已经走出很多步,因此需要计算一个平均ping值,当网络中某人的ping值低于这个值时,将弹出类似于魔兽/星际的同步对话框,等待其本地指令序号赶上其他玩家的序列号
- 由于所有物体的移动都可以被时间插值,因此,游戏中的每一逻辑帧,只需要将本地服务器在上一帧的ping值和帧号广播给所有的玩家
- 当物体启动和结束移动时广播
- 当渲染帧数下降时,将很明显的看到帧同步对象有很明显的"跳跃"现象,这个现象在星际中更是明显。但在技术成熟的魔兽中已经被插值予以替代