中止XNA主线程?

时间:2013-09-17 04:56:32

标签: c# multithreading xna

我目前正在将我创建的游戏从XNA的顺序方法(连续调用Updates和Draws)转换为多线程方法。

我已经成功地将游戏更新移动到了其他任务/线程。我遇到的唯一问题是弄清楚如何中止主XNA线程(扩展Game类的类),因为我确实有空的Update()Draw()方法。

当我尝试通过以下方式中止该线程时:

System.Threading.Thread.CurrentThread.Abort();

作为Initialize()类的Game方法的最后一行,整个应用程序终止。那么,有没有办法终止XNA的主线程并仍然执行游戏窗口?我试图终止这个帖子的原因是我不希望它通过执行空的Update / Draw来影响游戏的性能。

1 个答案:

答案 0 :(得分:2)

嗯 - 你真的不想中止主线程。该线程拥有XNA用于显示的窗口,您只能在主线程上进行输入(即:Mouse.GetStateKeyboard.GetState等。

在其上调用Abort相当于提升ThreadAbortException,它会冒泡并且(在默认的Program.cs模板中)清理您的游戏实例(请参阅{{1}声明)。

考虑简单地使用该主线程作为负责处理usingUpdate的线程。


但是,如果你真的已经开始做这件事了,你可以阻止XNA使用这段代码抽取更新:

Draw

(需要引用和使用Application.Idle = null; 。)

如果您想继续使用System.Windows.Forms中的功能,可以使用Game.RunOneFrameTick。如果你试图在离线调用这些方法的话,不知道XNA可能爆炸的奇妙方式。

如果您不使用它们,则需要提供自己的计时代码,您需要定期拨打Game(音频需要)。

无论哪种方式,你都必须想出一种在主线程上执行输入的方法。 Win32消息循环仍将在该线程上运行(或者更确切地说,阻塞),因此您需要挂钩以进行输入。