Unity3d 帧同步 VR游戏中是否可行

来源:互联网 发布:麻瓜编程爬虫 编辑:程序博客网 时间:2024/06/04 23:22
帧同步的原理大意是

,游戏运行时以10fps(100毫秒间隔,具体数值可根据实际情况调整)运行一个逻辑帧,逻辑帧负责物理、ai、攻击判定等等。而动画和实际位移由渲染帧负责。这样动画表现是流畅的。而客户端每逻辑帧都会与服务器进行通信同步客户端的操作,当操作同步完成客户端的逻辑帧可以继续向后模拟。比如运行第3帧要确保第一帧的数据是完整的。双方客户端接收的操作内容是一致的,初始状态是一致的,所以运行的结果也应该是一致的。随机数可以使用确定随机种子的伪随机数来解决。

       所以关键问题就是要确保客户端以同样的输入可以获得同样的运行结果。 这个是理论上可行的,很多rts游戏也都是基于此原理。比如魔兽争霸3  最高指挥官2  全面战争  星际争霸 帝国时代 等等。  以最高指挥官(Super Commander)为例,其全部单位有上千个,如果要实时同步他们的状态以现在的网络条件都是很困难的,所以这些rts同步的仅仅是操作,即点击了什么位置,点击了什么按钮,选择了什么目标,按了什么按键。客户端接收到对应的操作,进行同样的模拟,达到同样的输出。从而完成网络同步。


总的来说可以归纳为:客户端以输入模式,服务器以判定模式 运行。

输入模式:同步玩家的输入设备状态 , 即点击了什么位置,点击了什么按钮,选择了什么目标,按了什么按键。。。

判定模式:玩家有权限做这个操作就给他分发出去,没有就不干咯;其实服务不仅仅只管理玩家的行为同步,还有各个AI  道具的行为判断,不做管理就会出现两个客户端AI 行为不一致等等问题


VR游戏中同步速率要求更加严谨,因为VR 只要稍微延迟就很容易被玩家发现,VR游戏的服务器一点要很好,客户端的网速要稳定,同步直接用输入同步模式数据量会降低并保证了传输的及时性;


下面是OculusVR/SteamVR平台设备的输入模式同步数据结构:


大致算一下200byte 左右一个同步包,VR中每秒90~120fps 那么


1fps 同步一次的话:200byte*90=18000~200byte*120=2400 1.5k~2.5k 的数据  同步更慢的话就更小了


假设有100个人同时在线玩那么数据量将达到150k~250k 每秒 加上 其他同步也就300K左右 的数据同步


  [Serializable]
   public class PlayerSync
    {
        public int Id;


        public Vector3 HeadPostion;
        public Quaternion HeadRotation;


        public bool LeftHand;
        public Vector3 LeftHandPostion;
        public Quaternion LeftHandRotation;
        public KeyState LeftTrigger;
        public Vector2 LeftTriggerAsix;
        public KeyState LeftGrip;
        public Vector2 LeftGripAsix;
        public KeyState LeftThumstick;
        public TouchState LeftTouch;
        public Vector2 LeftTouchAsix;
        public KeyState LeftMenu;
        public KeyState LeftXButton;
        public KeyState LeftYButton;
        public Vector3 LeftHandVelocity;
  
        public bool RightHand;
        public Vector3 RightHandPostion;
        public Quaternion RightHandRotation;
        public KeyState RightTrigger;
        public Vector2 RightTriggerAsix;
        public KeyState RightGrip;
        public Vector2 RightGripAsix;
        public KeyState RightThumstick;
        public TouchState RightTouch;
        public Vector2 RightTouchAsix;
        public KeyState RightMenu;
        public KeyState RightAButton;
        public KeyState RightBButton;
        public Vector3 RightHandVelocity;
        
    }


public    enum KeyState: byte
    {
        Up,
        Down,
        Pressed,
        
    }

public    enum TouchState : byte
    {
        Start,
        End
    }





原创粉丝点击