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);
        }
 public virtual void OnGameTick(GGameInstance game)
 {
 }
 public virtual void OnGameStop(GGameInstance game)
 {
 }
        public virtual async System.Threading.Tasks.Task <bool> OnGameStart(GGameInstance game)
        {
            await Thread.AsyncDummyClass.DummyFunc();

            return(true);
        }