c# - XNA 中的线程

标签 c# multithreading xna

我在 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/

相关文章:

c# - 从数据库中删除条目

c# - 在 ASP.Net、C# 中以编程方式创建字段集、ol/ul 和 li 标记

java - 如何加入现有的 SwingWorker

Python/wxPython : Doing work continuously in the background

xna - 在 XNA 中使 Texture2D 的部分透明

c# - 如何将参数传递给 Controller ​​构造函数?这是正确的做法吗?

c# - 林克 : doing a Where() clause on a nested model

javascript - 如何在 JavaScript 中编写递归阻塞函数而不溢出堆栈?

c# - 如何将 3x2 矩阵转换为 4x4 矩阵?

c# - XNA 到 Mono Android 转换 : What is a simple (or the simplest) way of handling the activity life cycle?