Ejemplo n.º 1
0
 public void AwakeCommand(IFrameCommand cmd)
 {
 }
 public void OnReceive(IFrameCommand cmd)
 {
 }
Ejemplo n.º 3
0
 public void Preprocess(IFrameCommand cmd)
 {
 }
 public void ExecCommand(IFrameCommand cmd)
 {
 }
Ejemplo n.º 5
0
 public override void CmdCommonLearnTalent(IFrameCommand cmd)
 {
 }
Ejemplo n.º 6
0
 public void ExecCommand(IFrameCommand cmd)
 {
     Singleton <BattleLogic> .instance.DealGameSurrender(this.m_bWinCamp);
 }
Ejemplo n.º 7
0
        /// <summary>
        /// 该方法每个渲染帧会执行一次,但是会以逻辑帧间隔,经过平均延迟计算,触发逻辑帧的执行
        /// </summary>
        /// <param name="bLocalTimeDriver"></param>
        private void UpdateMultiFrame(bool bLocalTimeDriver = false)
        {
            {
                MEObjDeliver e = ObjectCachePool.instance.Fetch <MEObjDeliver>();
                e.opcode = (int)EObjDeliverOPCode.E_OP_UPDATE_TAILS_OF_GAME_LOGIC;
                Mercury.instance.Broadcast(EventTokenTable.et_framesynchr, this, e);
            }

            int drift = (int)((EndFrameNum - CurFrameNum) / (uint)nDriftFactor);

            tryCount = Mathf.Clamp(drift, 1, 100);
            int   i  = tryCount;
            float rt = Time.realtimeSinceStartup;

            if (bLocalTimeDriver)
            {
                rt = fLocalRunTime + startFrameTime;
            }

            //帧同步开始后经过了多少时间。nowtime 是渲染帧间隔,小于一个逻辑帧
            long nowTime = (long)((rt - startFrameTime) * 1000f);

            long nDelayMs = nowTime - (long)((SvrFrameIndex + 1u) * SvrFrameDelta);
            //平均延迟(以30帧计算)
            int smoothDelay = CalculateJitterDelay(nDelayMs);

            nowTime *= (long)frameSpeed;
            while (i > 0)
            {
                long lastTime  = (long)(CurFrameNum * FrameDelta);
                long deltaTime = nowTime - lastTime;
                deltaTime -= (long)smoothDelay;
                //这里是处理核心,如果 deltaTime 随着渲染帧的增长而增长,当他小于一个逻辑帧时,则不做任何处理,当他大于一个逻辑帧时,则触发一次逻辑帧处理
                if (deltaTime >= (long)FrameDelta)
                {
                    //假设一直没有收到新的逻辑帧,则每次都会执行到这里
                    if (CurFrameNum >= EndFrameNum)
                    {
                        EndBlockWaitNum += 1u;
                        i = 0;
                    }
                    else
                    {
                        EndBlockWaitNum = 0u;
                        CurFrameNum    += 1u;
                        LogicFrameTick += (ulong)FrameDelta;

                        //先执行命令,再刷新游戏逻辑
                        while (commandQueue.Count > 0)
                        {
                            IFrameCommand frameCommand = commandQueue.Peek();
                            uint          commandFrame = (frameCommand.frameNum + SvrFrameLater) * KeyFrameRate;
                            if (commandFrame > CurFrameNum)
                            {
                                break;
                            }

                            frameCommand          = commandQueue.Dequeue();
                            frameCommand.frameNum = commandFrame;
                            frameCommand.ExecCommand();

                            AbstractSmartObj obj = (AbstractSmartObj)frameCommand;
                            if (obj != null)
                            {
                                obj.Release();
                            }
                        }
                        if (!bEscape)
                        {
                            //通知刷新游戏逻辑层
                            MEObjDeliver e = ObjectCachePool.instance.Fetch <MEObjDeliver>();

                            e.args[0] = (int)FrameDelta;
                            e.args[1] = i == 1 && deltaTime < (long)(2u * FrameDelta); //false;
                            e.opcode  = (int)EObjDeliverOPCode.E_OP_UPDATE_GAME_LOGIC;

                            Mercury.instance.Broadcast(EventTokenTable.et_framesynchr, this, e);
                        }
                        i--;
                    }
                }
                else
                {
                    i = 0;
                }
            }
        }