C# 中止XNA主线程?
我目前正在将我从XNA的顺序方法(连续调用更新和绘制)创建的游戏转变为多线程方法 我已经成功地将游戏更新和绘图移动到其他任务/线程。我遇到的唯一问题是如何中止主XNA线程(扩展游戏类的类),因为我实际上有空的C# 中止XNA主线程?,c#,multithreading,xna,C#,Multithreading,Xna,我目前正在将我从XNA的顺序方法(连续调用更新和绘制)创建的游戏转变为多线程方法 我已经成功地将游戏更新和绘图移动到其他任务/线程。我遇到的唯一问题是如何中止主XNA线程(扩展游戏类的类),因为我实际上有空的Update()和Draw()方法 当我尝试通过以下方式中止该线程时: System.Threading.Thread.CurrentThread.Abort(); 作为Game类的Initialize()方法的最后一行,整个应用程序终止。那么,有没有一种方法可以终止XNA的主线程,并且仍
Update()
和Draw()
方法
当我尝试通过以下方式中止该线程时:
System.Threading.Thread.CurrentThread.Abort();
作为Game
类的Initialize()
方法的最后一行,整个应用程序终止。那么,有没有一种方法可以终止XNA的主线程,并且仍然执行游戏窗口?我试图终止此线程的原因是,我不希望它通过执行空的更新/绘制来影响游戏的性能。好吧,你真的不想中止主线程。该线程拥有XNA用于显示的窗口,您只能在主线程上进行输入(即:鼠标.GetState
,键盘.GetState
,等等)
在其上调用Abort
相当于引发ThreadAbortException
,它将冒泡并(在默认的Program.cs
模板中)清理游戏实例(请参阅using
语句)
考虑简单地使用主线程作为负责处理Update
或Draw
的线程
但如果您真的下定决心这么做,您可以阻止XNA使用以下代码进行更新:
Application.Idle = null;
(需要引用和使用System.Windows.Forms
)
如果您想继续使用游戏
中的功能,可以使用Game.RunOneFrame
或勾选
。如果您试图取消这些方法,那么就不知道XNA可能会以什么方式爆炸
如果您不使用它们,您需要提供自己的计时代码,您需要调用FrameworkDispatcher.Update
(音频所需)
无论哪种方式,您都必须找到在主线程上执行输入的方法。Win32消息循环仍将在该线程上运行(或者,更确切地说,是阻塞),因此您需要连接到该线程以进行输入。如果不需要,主线程将调用
Update
和Draw
,您至少可以设置Enable=Visible=false
@pinckerman仅适用于(Drawable
)GameComponent
s。主回路本身没有这样的选项。@AndrewRussell你是对的,我的错。谢谢。使用XNA主线程的另一个原因是不能从主线程以外的其他线程重置图形设备!我只是在尝试重置时遇到“未定义”异常时才发现这一点。根据MSDN:如果调用重置的线程与用于创建要重置的图形设备的线程不同,则调用重置失败