运行更新后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的人来说,这可能是一个快速的解决方案。
您的Splash
类是什么样子的?Exit
是Game类的一个方法,并退出游戏。您的Splash
类是否继承了Game
?如果是这样,那就不应该了。
编辑:
在更清楚地阅读了文章的下半部分之后,您应该只有一个继承自Game
的类,并且它应该运行您的游戏。如果你想显示一个启动屏幕,它应该是一个自定义类,或者查看游戏状态管理示例。