示例#1
0
    public void FixedUpdate()
    {
        Fix64 deltaTime = GTime.FixedDeltaTime;

        /**************以下是帧同步的核心逻辑*********************/
        AccumilatedTime = AccumilatedTime + deltaTime;

        //如果真实累计的时间超过游戏帧逻辑原本应有的时间,则循环执行逻辑,确保整个逻辑的运算不会因为帧间隔时间的波动而计算出不同的结果
        while (AccumilatedTime > NextGameTime)
        {
            // -----------------------------------
            // 替换帧同步的数据同步
            LocalFrameSynServer.SynFrameData();
            // -----------------------------------

            //运行与游戏相关的具体逻辑
            GEvent.DispatchEvent(GacEvent.UpdateFrameLogic);
            //计算下一个逻辑帧应有的时间
            NextGameTime += FrameLen;
            //游戏逻辑帧自增
            FsData.GameLogicFrame += 1;
        }

        //计算两帧的时间差,用于补间动画(interpolation是从0渐变到1的值,为什么?请查看Vector3.Lerp的用法)
        Interpolation = (AccumilatedTime + FrameLen - NextGameTime) / FrameLen;

        //更新渲染
        GEvent.DispatchEvent(GacEvent.UpdateFrameRender, Interpolation);
        /**************帧同步的核心逻辑完毕*********************/
    }
    public void Start(bool replay = false, string recordName = "")
    {
        //-----------------------------------
        //本地帧同步开始
        LocalFrameSynServer.Start();
        //-----------------------------------

        //监听事件
        RegistEvent();

        //初始化数据
        fsData = new FrameSynchronData(1000)
        {
            //初始为暂停状态
            PauseState = true
        };

        //回放
        if (replay)
        {
            fsData.ReplayState = true;
            LoadBattleData(recordName);
        }

        //初始化帧同步逻辑对象
        LockStep = new LockStep(fsData);

        //游戏运行速度
        GTime.TimeScale = 1;

        isStart = true;
    }