private void Loop() { try { while (CenterHubApi.IsRun()) { long curTime = TimeUtility.GetLocalMilliseconds(); if (m_LastTickTime != 0) { long elapsedTickTime = curTime - m_LastTickTime; if (elapsedTickTime > c_WarningTickTime) { LogSys.Log(LOG_TYPE.MONITOR, "GameFramework Network Tick:{0}", curTime - m_LastTickTime); } } m_LastTickTime = curTime; CenterHubApi.Tick(); Thread.Sleep(10); if (m_WaitQuit) { if (m_GlobalProcessThread.LastSaveFinished && m_UserProcessScheduler.LastSaveFinished && m_QuitFinish == false) { //全局数据和玩家数据存储完毕 int saveReqCount = m_DataCacheThread.CalcSaveRequestCount(); LogSys.Log(LOG_TYPE.MONITOR, "QuitStep_1. GlobalData and UserData last save done. SaveRequestCount:{0}", saveReqCount); if (saveReqCount > 0) { //等待5s long startTime = TimeUtility.GetLocalMilliseconds(); while (startTime + 5000 > TimeUtility.GetLocalMilliseconds()) { CenterClientApi.Tick(); Thread.Sleep(10); } } else { //通知关闭DataCache m_QuitFinish = true; LogSys.Log(LOG_TYPE.MONITOR, "QuitStep_2. Notice DataCache to quit."); CenterClientApi.SendCommandByName("DataCache", "QuitDataStore"); //等待10s long startTime = TimeUtility.GetLocalMilliseconds(); while (startTime + 10000 > TimeUtility.GetLocalMilliseconds()) { CenterClientApi.Tick(); Thread.Sleep(10); } //关闭GameFramework LogSys.Log(LOG_TYPE.MONITOR, "QuitStep_3. LastSaveDone. GameFramework quit..."); CenterClientApi.Quit(); } } else { if (curTime - m_LastWaitQuitTime > c_WaitQuitTimeInterval) { m_WaitQuit = false; LogSys.Log(LOG_TYPE.MONITOR, "QuitStep_-1. Reset m_WaitQuit to false."); } } } } } catch (Exception ex) { LogSys.Log(LOG_TYPE.ERROR, "GameFramework.Loop throw exception:{0}\n{1}", ex.Message, ex.StackTrace); } }