我目前正在将我创建的游戏从XNA的顺序方法(连续调用Updates和Draws)转换为多线程方法。
我已经成功地将游戏更新移动到了其他任务/线程。我遇到的唯一问题是弄清楚如何中止主XNA线程(扩展Game类的类),因为我确实有空的Update()
和Draw()
方法。
当我尝试通过以下方式中止该线程时:
System.Threading.Thread.CurrentThread.Abort();
作为Initialize()
类的Game
方法的最后一行,整个应用程序终止。那么,有没有办法终止XNA的主线程并仍然执行游戏窗口?我试图终止这个帖子的原因是我不希望它通过执行空的Update / Draw来影响游戏的性能。
答案 0 :(得分:2)
嗯 - 你真的不想中止主线程。该线程拥有XNA用于显示的窗口,您只能在主线程上进行输入(即:Mouse.GetState
,Keyboard.GetState
等。
在其上调用Abort
相当于提升ThreadAbortException
,它会冒泡并且(在默认的Program.cs
模板中)清理您的游戏实例(请参阅{{1}声明)。
考虑简单地使用该主线程作为负责处理using
或Update
的线程。
但是,如果你真的已经开始做这件事了,你可以阻止XNA使用这段代码抽取更新:
Draw
(需要引用和使用Application.Idle = null;
。)
如果您想继续使用System.Windows.Forms
中的功能,可以使用Game.RunOneFrame
或Tick
。如果你试图在离线调用这些方法的话,不知道XNA可能爆炸的奇妙方式。
如果您不使用它们,则需要提供自己的计时代码,您需要定期拨打Game
(音频需要)。
无论哪种方式,你都必须想出一种在主线程上执行输入的方法。 Win32消息循环仍将在该线程上运行(或者更确切地说,阻塞),因此您需要挂钩以进行输入。