我在 XNA 中有一个游戏需要进行网络调用。在更新方法中,我确定需要发送的内容,然后将其添加到要发送的内容列表中。然后我运行网络调用。这明显减慢了应用程序的速度。所以我首先尝试在更新中创建一个像这样的新线程,让它在一个单独的线程上执行:
Thread thread;
thread = new Thread(
new ThreadStart(DoNetworkThing));
thread.Start();
我假设创建线程有开销等导致这更慢。
最后,我制作了一个包含 while(true){DoNetworkThing();}
的方法,它将不断循环并一遍又一遍地运行网络调用(它会检查它是否已经忙于一,有没有东西要寄)。我在线程中的 LoadContent 方法中调用了该方法,因此它会在自己的线程中与游戏一起运行。
但这也确实很慢。
那我做错了什么?这样做的最佳方法是什么? 谢谢
最佳答案
当我最初尝试在 XNA 上使用线程时,我遇到了这个确切的问题——添加一个线程会减慢一切。事实证明,线程亲和性是问题所在。
在 Xbox 360 上,默认情况下,所有线程都在同一个处理器内核上运行;这种行为与 Windows 不同,在 Windows 中,内核会为您将线程放置到其他内核上。 (有关详细信息,请参阅 MSDN 社交网站 this thread 上的答案。)
要绕过它,您需要在线程函数中将线程的亲和性设置为另一个核心:
void DoNetworkThing()
{
#ifdef XBOX
Thread.SetProcessorAffinity(3); // see note below
#endif
/* your code goes here */
}
Thread thread = new Thread(
new ThreadStart(DoNetworkThing));
thread.Start();
Thread.SetProcessorAffinity
的文档指出,在 XNA 上,核心 0 和 2 是为框架保留的;核心 1 和核心 3-5 可供您免费使用。主线程(包含你的 main()
函数的线程)将在核心 1 上。上面的代码任意设置线程在核心 3 上运行,但你可以选择不同的核心,或者添加代码以编程方式选择一个核心(如果您有多个线程,您可能想要这样做)。
最后,请注意 #ifdef
守卫 - Thread.SetProcessorAffinity
仅在 Xbox 上可用;它甚至不会在 Windows 上编译!
关于c# - XNA 中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3162436/