运行更新后GC收集的XNA游戏

本文关键字:XNA 游戏 更新 GC 运行 | 更新日期: 2023-09-27 18:27:24


我正在编写一个返回游戏模式(int)和IP地址(string)的启动屏幕。这个想法是启动屏幕运行,接受用户输入,然后使用这些选项运行主游戏。我使用一个线程来实现这一点——该线程从启动屏幕轮询退出请求,然后将值提取到program.cs,并在启动时调用exit()

主游戏独立运行,没有任何问题,但启用了启动屏幕后,游戏只运行了1帧,并且在运行更新方法后似乎被垃圾收集处理掉了。(如果试图引用它,则返回DisposedObjectException或类似的东西)经过一点调试,我发现问题出在exit命令上。代码如下:

using System;
using System.Threading;
namespace SplashScreen
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        static void Main(string[] args)
        {
            int choice = 0;
            string ip = "";
            bool runSplash = true;
            bool useThreading = true;
            bool ignoreThreadResponse = false;
            // Debug option, toggle running splash screen
            if (runSplash == true)
            {
                bool splashrunning = true;
                using (Splash1 splash = new Splash1())
                {
                    if (useThreading)
                    {
                        // Run a thread to poll whether the splash screen has requested an exit every 0.5 seconds
                        Thread t = new Thread(() =>
                        {
                            while (splashrunning)
                            {
                                // If splash requests exit pull gameMode choice and IP Address before killing it, then quit this thread
                                if (splash.requestingExit)
                                {
                                    choice = splash.choice;
                                    ip = splash.ip;
                                    // The offending piece of code, without this you can simply select an option, force close and second part runs fine
                                    //splash.Exit();
                                    splashrunning = false;
                                }
                                Thread.Sleep(500);
                            }
                        });
                        t.Start();
                    }
                    splash.Run();
                }
            }
            // If splash screen is not running, assign default values
            if(!useThreading || !runSplash || ignoreThreadResponse)
            {
                choice = 2;
                ip = "127.0.0.1";
            }
            if (choice != 0)
            {
                // This game is picked up by garbage collection after running Update once
                using (Game1 game = new Game1(choice, ip))
                {
                    game.Run();
                }
            }
        }
    }
}

飞溅时。调用Exit(),它会导致在第一次更新后收集game1。如果我禁用线程,它可以正常工作。如果我使用右上角的X退出,效果会很好。无论我是否忽略线程响应,如果启用线程并调用splash,游戏都无法运行。退出()

我要找的是以下任何一个:

  • 收集第二个游戏的原因。

  • 退出游戏或调用"关闭窗口"(大红色x)函数的另一种方法。

  • 实现这一点的更好方法。

我过去曾使用控制台输入来实现这一点,但我想继续使用图形界面,而不是为用户提供难看的命令提示符

编辑:
原来我差点就到了。虽然GSM可能是正确的做法,但对于那些只想从问题中获取代码并将谨慎抛诸脑后的人来说,你只需要添加一个线程来运行第二个游戏
我敢肯定这并不理想,但对我来说,这是一个小得多的调整。

Thread gt = new Thread(() =>
{
    using (Game1 game = new Game1(choice, ip))
    {
        game.Run();
    }
});
gt.Start();

因此,虽然我建议任何从头开始使用GSM的人,但对于其他试图运行GSM的人来说,这可能是一个快速的解决方案。

运行更新后GC收集的XNA游戏

您的Splash类是什么样子的?Exit是Game类的一个方法,并退出游戏。您的Splash类是否继承了Game?如果是这样,那就不应该了。

编辑:

在更清楚地阅读了文章的下半部分之后,您应该只有一个继承自Game的类,并且它应该运行您的游戏。如果你想显示一个启动屏幕,它应该是一个自定义类,或者查看游戏状态管理示例。