public async System.Threading.Tasks.Task StopGame() { McGame.Get()?.OnGameStop(mGameInstance); foreach (var i in AutoMembers) { i.Key.OnGameStop(i.Value); } var savedLogic = CEngine.Instance.ThreadLogic.LimitTime; var savedRender = CEngine.Instance.ThreadRHI.LimitTime; CEngine.Instance.ThreadLogic.LimitTime = long.MaxValue; CEngine.Instance.ThreadRHI.LimitTime = long.MaxValue; await EngineNS.CEngine.Instance.EventPoster.Post(() => { while (mGameInstance != null && mGameInstance.GameState != GamePlay.GGameInstance.enGameState.Initialized) { System.Threading.Thread.Sleep(50); } if (mGameInstance == null) { return(false); } mGameInstance.GameState = GamePlay.GGameInstance.enGameState.Stopping; mGameInstance.FinalGame(); mGameInstance.GameState = GamePlay.GGameInstance.enGameState.Stopped; CEngine.Instance.TickManager.RemoveTickInfo(mGameInstance); mGameInstance = null; return(true); }, Thread.Async.EAsyncTarget.Logic); //EngineNS.CEngine.Instance.EventPoster.RunOn(() => //{ // if (mGameInstance == null) // return false; // mGameInstance.GameState = GamePlay.GGameInstance.enGameState.Stopping; // mGameInstance.FinalGame(); // mGameInstance.GameState = GamePlay.GGameInstance.enGameState.Stopped; // CEngine.Instance.TickManager.RemoveTickInfo(mGameInstance); // mGameInstance = null; // return true; //}, Thread.Async.EAsyncTarget.Logic); OnGameStoped(); McGame.Reset(); CEngine.Instance.MacrossDataManager.CleanDebugContextGCRefrence(); CEngine.Instance.ThreadLogic.LimitTime = savedLogic; CEngine.Instance.ThreadRHI.LimitTime = savedRender; //CEngine.Instance.MacrossDataManager.ClearDebugContext(); GC.Collect(); GC.WaitForFullGCComplete(); GC.Collect(); GC.WaitForFullGCComplete(); if (TickableNum != CEngine.Instance.TickManager.GetTickableNum()) { System.Diagnostics.Debug.Assert(false); } }
public async System.Threading.Tasks.Task <bool> StartGame(Type gameInstanceType, IntPtr WinHandle, UInt32 width, UInt32 height, EngineNS.GamePlay.GGameInstanceDesc desc, EngineNS.Graphics.CGfxCamera camera, RName startScript) { #if PWindow //Bricks.RemoteServices.RPCExecManager.Insance.SaveCode(); #endif McGame = CEngine.Instance.MacrossDataManager.NewObjectGetter <GamePlay.McGameInstance>(startScript); TickableNum = CEngine.Instance.TickManager.GetTickableNum(); if (mGameInstance != null && mGameInstance.GameState != GamePlay.GGameInstance.enGameState.Stopped) { return(false); } var savedLogic = CEngine.Instance.ThreadLogic.LimitTime; var savedRender = CEngine.Instance.ThreadRHI.LimitTime; CEngine.Instance.ThreadLogic.LimitTime = long.MaxValue; CEngine.Instance.ThreadRHI.LimitTime = long.MaxValue; mGameInstance = System.Activator.CreateInstance(gameInstanceType) as GamePlay.GGameInstance; mGameInstance.GameState = GamePlay.GGameInstance.enGameState.initializing; try { if (false == await mGameInstance.InitGame(WinHandle, width, height, desc, camera)) { CEngine.Instance.ThreadLogic.LimitTime = savedLogic; CEngine.Instance.ThreadRHI.LimitTime = savedRender; return(false); } } catch (Exception ex) { Profiler.Log.WriteException(ex); } foreach (var i in AutoMembers) { await i.Key.OnGameStart(i.Value); } OnGameStarted(); CEngine.Instance.ThreadLogic.LimitTime = savedLogic; CEngine.Instance.ThreadRHI.LimitTime = savedRender; var smp = Thread.ASyncSemaphore.CreateSemaphore(1); EngineNS.CEngine.Instance.EventPoster.RunOn(async() => { var mcGame = McGame.Get(); if (mcGame != null) { Profiler.Log.WriteLine(Profiler.ELogTag.Info, "Macross", "Macross begin mcGame.OnGameStart"); try { await mcGame.OnGameStart(mGameInstance); } catch (Exception ex) { Profiler.Log.WriteException(ex); } Profiler.Log.WriteLine(Profiler.ELogTag.Info, "Macross", "Macross end mcGame.OnGameStart"); } smp.Release(); return(true); }, Thread.Async.EAsyncTarget.Logic); await smp.Await(); mGameInstance.GameState = GamePlay.GGameInstance.enGameState.Initialized; await mGameInstance.OnGameInited(); return(true); }