public static void SyncFightInfo(InBattleRuntimeInfo fightInfo)
        {
            if (fightInfo == null || fightInfo.teamInfos == null)
            {
                return;
            }
            if (fightInfo.frameTime > 0)
            {
                FrameSyncManager.Instance.OneFrameTime = (double)((float)fightInfo.frameTime / 1000f);
            }
            PvpProtocolTools.ResetHeroStatistic(fightInfo);
            GameManager.Instance.SurrenderMgr.SyncInfos(fightInfo.surrenderInfos);
            Singleton <PvpManager> .Instance.RoomInfo.CtrlUniqueIds.Clear();

            if (fightInfo.unitInfos == null)
            {
                return;
            }
            PvpProtocolTools.SyncSceneState(fightInfo.sceneValues);
            Singleton <PvpManager> .Instance.GameStartTime = new DateTime?(DateTime.Now - TimeSpan.FromTicks(fightInfo.gameTime));
            Dictionary <int, Units> allMapUnits = MapManager.Instance.GetAllMapUnits();
            List <Units>            list        = new List <Units>();

            foreach (Units unit in allMapUnits.Values)
            {
                if ((!unit.isHero && !unit.isHome && !unit.isBuilding) || unit.MirrorState)
                {
                    if (unit.isLive)
                    {
                        UnitRuntimeInfo unitRuntimeInfo = fightInfo.unitInfos.FirstOrDefault((UnitRuntimeInfo x) => x.baseUnitInfo.unitId == unit.unique_id);
                        if (unitRuntimeInfo == null)
                        {
                            list.Add(unit);
                        }
                    }
                }
            }
            foreach (Units current in list)
            {
                MapManager.Instance.DespawnUnit(current);
            }
            for (int i = 0; i < fightInfo.unitInfos.Length; i++)
            {
                PvpProtocolTools.SyncSingleUnit(fightInfo.unitInfos[i]);
            }
            Singleton <MiniMapView> .Instance.UpdateAfterReConect();
        }