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