protected override void OnTick() { try { long curTime = TimeUtility.GetServerMilliseconds(); if (m_LastLogTime + 60000 < curTime) { m_LastLogTime = curTime; DebugPoolCount((string msg) => { LogSys.Log(LOG_TYPE.INFO, "RoomThread.ActionQueue {0}, thread {1}", msg, cur_thread_id_); }); } long tick_interval_us = tick_interval_ * 1000; TimeSnapshot.Start(); DoTick(); long elapsedTime = TimeSnapshot.End(); if (elapsedTime >= tick_interval_us) { if (elapsedTime >= tick_interval_us * 2) { LogSys.Log(LOG_TYPE.DEBUG, "*** Warning, RoomThread tick interval is {0} us !", elapsedTime); foreach (Room room in active_room_) { Scene scene = room.GetActiveScene(); if (null != scene) { if (scene.SceneState == SceneState.Running) { SceneProfiler profiler = scene.SceneProfiler; LogSys.Log(LOG_TYPE.DEBUG, "{0}", profiler.GenerateLogString(scene.SceneResId, scene.GameTime.ElapseMilliseconds)); } } } } Thread.Sleep(0); } else { Thread.Sleep((int)(tick_interval_ - elapsedTime / 1000)); } } catch (Exception ex) { LogSys.Log(LOG_TYPE.ERROR, "Exception {0}\n{1}", ex.Message, ex.StackTrace); } }
internal void SightTick() { if (m_SceneState != SceneState.Sleeping) { TimeSnapshot.DoCheckPoint(); //移动版本不需要计算视野 //NOTE: sight manager 必须放在movementsystem之后,它需要等待玩家的碰撞形状wordposition更新 /* * if (IsAllPlayerEntered()) { * if (IsPvpScene) { * m_SightManager.Tick(); * } else { * for (LinkedListNode<UserInfo> node = UserManager.Users.FirstValue; null != node; node = node.Next) { * UserInfo user = node.Value; * if (null != user) { * user.CurBlueCanSeeMe = true; * user.CurRedCanSeeMe = true; * } * } * for (LinkedListNode<NpcInfo> node = NpcManager.Npcs.FirstValue; null != node; node = node.Next) { * NpcInfo npc = node.Value; * if (null != npc) { * npc.CurBlueCanSeeMe = true; * npc.CurRedCanSeeMe = true; * } * } * } * } * if (IsPvpScene && IsAllPlayerEntered()) { * TickSight(); * } */ m_SceneProfiler.SightTickTime = TimeSnapshot.DoCheckPoint(); } }
/** * @brief 逻辑循环 */ public void Tick() { TimeSnapshot.Start(); TimeSnapshot.DoCheckPoint(); if (m_CurScene == null || !m_CurScene.IsSuccessEnter) { return; } m_Profiler.sceneTickTime = TimeSnapshot.DoCheckPoint(); EntityManager.Instance.Tick(); m_Profiler.entityMgrTickTime = TimeSnapshot.DoCheckPoint(); ControlSystem.Instance.Tick(); m_Profiler.controlSystemTickTime = TimeSnapshot.DoCheckPoint(); m_Profiler.movementSystemTickTime = TimeSnapshot.DoCheckPoint(); m_SpatialSystem.Tick(); m_Profiler.spatialSystemTickTime = TimeSnapshot.DoCheckPoint(); if (m_Profiler.spatialSystemTickTime > 50000) { LogSystem.Warn("*** SpatialSystem tick time is {0}", m_Profiler.spatialSystemTickTime); for (LinkedListNode <UserInfo> node = UserManager.Users.FirstValue; null != node; node = node.Next) { UserInfo userInfo = node.Value; if (null != userInfo) { LogSystem.Warn("===>User:{0} Pos:{1}", userInfo.GetId(), userInfo.GetMovementStateInfo().GetPosition3D().ToString()); } } for (LinkedListNode <NpcInfo> node = NpcManager.Npcs.FirstValue; null != node; node = node.Next) { NpcInfo npcInfo = node.Value; if (null != npcInfo) { LogSystem.Warn("===>Npc:{0} Pos:{1}", npcInfo.GetId(), npcInfo.GetMovementStateInfo().GetPosition3D().ToString()); } } } m_AiSystem.Tick(); m_Profiler.aiSystemTickTime = TimeSnapshot.DoCheckPoint(); //obj特殊逻辑处理 TickUsers(); m_Profiler.usersTickTime = TimeSnapshot.DoCheckPoint(); TickNpcs(); m_Profiler.npcsTickTime = TimeSnapshot.DoCheckPoint(); try { TickSystemByCharacters(); } catch (Exception e) { GfxSystem.GfxLog("Exception:{0}\n{1}", e.Message, e.StackTrace); } m_Profiler.combatSystemTickTime = TimeSnapshot.DoCheckPoint(); if (IsPveScene()) { TickPve(); } long tickTime = TimeSnapshot.End(); if (tickTime > 100000) { LogSystem.Debug("*** PerformanceWarning: {0}", m_Profiler.GenerateLogString(tickTime)); } }
private void TickRunning() { TimeSnapshot.DoCheckPoint(); m_ServerDelayActionProcessor.HandleActions(100); m_SceneProfiler.DelayActionProcessorTime = TimeSnapshot.DoCheckPoint(); m_ControlSystemOperation.Tick(); m_MovementSystem.Tick(); m_SceneProfiler.MovementSystemTime = TimeSnapshot.DoCheckPoint(); m_SpatialSystem.Tick(); m_SceneProfiler.SpatialSystemTime = TimeSnapshot.DoCheckPoint(); m_AiSystem.Tick(); m_SceneProfiler.AiSystemTime = TimeSnapshot.DoCheckPoint(); m_SceneLogicSystem.Tick(); m_SceneProfiler.SceneLogicSystemTime = TimeSnapshot.DoCheckPoint(); m_StorySystem.Tick(); m_GmStorySystem.Tick(); m_SceneProfiler.StorySystemTime = TimeSnapshot.DoCheckPoint(); //技能逻辑Tick TickSkill(); m_SceneProfiler.TickSkillTime = TimeSnapshot.DoCheckPoint(); //obj特殊状态处理(如死亡,重生等) TickUsers(); m_SceneProfiler.TickUsersTime = TimeSnapshot.DoCheckPoint(); TickNpcs(); m_SceneProfiler.TickNpcsTime = TimeSnapshot.DoCheckPoint(); TickLevelup(); m_SceneProfiler.TickLevelupTime = TimeSnapshot.DoCheckPoint(); //属性回复 if (0 == m_LastTickTimeForTickPerSecond) { m_LastTickTimeForTickPerSecond = TimeUtility.GetServerMilliseconds(); TickRecover(); TickBlindage(); } else { long curTime = TimeUtility.GetServerMilliseconds(); if (curTime > m_LastTickTimeForTickPerSecond + c_IntervalPerSecond) { m_LastTickTimeForTickPerSecond = curTime; TickRecover(); TickBlindage(); } } m_SceneProfiler.TickAttrRecoverTime = TimeSnapshot.DoCheckPoint(); //空间信息调试 TickDebugSpaceInfo(); m_SceneProfiler.TickDebugSpaceInfoTime = TimeSnapshot.DoCheckPoint(); }