0

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

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

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

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

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

4

1 回答 1

2

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

调用Abort它相当于引发 a ThreadAbortException,它将冒泡并(在默认Program.cs模板中)清理您的游戏实例(参见using语句)。

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


但是,如果您真的下定决心要这样做,您可以使用以下代码阻止 XNA 进行更新:

Application.Idle = null;

(需要引用和使用System.Windows.Forms。)

Game.RunOneFrame如果您Tick想继续使用Game. 如果您尝试在线程外调用这些方法,则不知道 XNA 可能会爆炸的奇妙方式。

如果您不使用它们,则需要提供自己的计时码,您需要FrameworkDispatcher.Update定期调用(音频需要)。

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

于 2013-09-17T07:46:41.603 回答