正在中止 XNA 主线程

本文关键字:线程 XNA | 更新日期: 2023-09-27 18:31:36

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

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

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

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

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

正在中止 XNA 主线程

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

在其上调用 Abort 等效于引发 ThreadAbortException ,这将冒泡并(在默认的Program.cs模板中)清理您的游戏实例(请参阅 using 语句)。

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


但是,如果您真的打算这样做,则可以使用以下代码阻止XNA进行更新:

Application.Idle = null;

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

如果您想

继续使用Game中的功能,也许可以使用Game.RunOneFrameTick。不知道如果您尝试将这些方法调离线程,XNA 可能会以什么奇妙的方式爆炸。

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

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