protected override void OnTick() { try { long curTime = TimeUtility.GetLocalMilliseconds(); if (m_LastTickTime != 0) { long elapsedTickTime = curTime - m_LastTickTime; if (elapsedTickTime > c_WarningTickTime) { LogSys.Log(LOG_TYPE.MONITOR, "RoomThread Tick:{0}", elapsedTickTime); } } m_LastTickTime = curTime; 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_); }); LogSys.Log(LOG_TYPE.MONITOR, "RoomThread.ActionQueue Current Action {0}", this.CurActionNum); } 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.ActiveScene; 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); } }
static public int constructor(IntPtr l) { try { GameFramework.TimeSnapshot o; o = new GameFramework.TimeSnapshot(); pushValue(l, true); pushValue(l, o); return(2); } catch (Exception e) { return(error(l, e)); } }
private void TickRunning() { TimeSnapshot.DoCheckPoint(); m_KdTree.BeginBuild(m_EntityMgr.Entities.Count); for (LinkedListNode <EntityInfo> linkNode = m_EntityMgr.Entities.FirstNode; null != linkNode; linkNode = linkNode.Next) { EntityInfo info = linkNode.Value; m_KdTree.AddObjForBuild(info); } m_KdTree.EndBuild(); m_ServerDelayActionProcessor.HandleActions(100); m_SceneProfiler.DelayActionProcessorTime = TimeSnapshot.DoCheckPoint(); m_MovementSystem.Tick(); m_SceneProfiler.MovementSystemTime = TimeSnapshot.DoCheckPoint(); TickAi(); m_SceneProfiler.AiSystemTime = TimeSnapshot.DoCheckPoint(); m_SceneLogicSystem.Tick(); m_SceneProfiler.SceneLogicSystemTime = TimeSnapshot.DoCheckPoint(); m_StorySystem.Tick(); m_GmStorySystem.Tick(); m_SceneProfiler.StorySystemTime = TimeSnapshot.DoCheckPoint(); TickEntities(); m_SceneProfiler.TickEntitiesTime = TimeSnapshot.DoCheckPoint(); //属性同步 if (0 == m_LastTickTimeForTickPerSecond) { m_LastTickTimeForTickPerSecond = TimeUtility.GetLocalMilliseconds(); TickProperty(); } else { long curTime = TimeUtility.GetLocalMilliseconds(); if (curTime > m_LastTickTimeForTickPerSecond + c_IntervalPerSecond) { m_LastTickTimeForTickPerSecond = curTime; TickProperty(); } } if (0 == m_LastTickTimeForTickPer5s) { m_LastTickTimeForTickPer5s = TimeUtility.GetLocalMilliseconds(); ReloadObjects(); } else { long curTime = TimeUtility.GetLocalMilliseconds(); if (curTime > m_LastTickTimeForTickPer5s + c_IntervalPer5s) { m_LastTickTimeForTickPer5s = curTime; ReloadObjects(); } } m_SceneProfiler.TickAttrRecoverTime = TimeSnapshot.DoCheckPoint(); //空间信息调试 TickDebugSpaceInfo(); m_SceneProfiler.TickDebugSpaceInfoTime = TimeSnapshot.DoCheckPoint(); }