加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在XNA中进行线程处理

发布时间:2020-12-15 19:36:34 所属栏目:百科 来源:网络整理
导读:我在XNA中有一个需要进行网络呼叫的游戏.在更新方法中,我确定需要发送的内容,然后将其添加到要发送的内容列表中.然后我运行网络呼叫.这显然会减慢应用程序的速度.所以我首先尝试在更新中创建这样的新线程,使其在单独的线程上执行: Thread thread; thread =
我在XNA中有一个需要进行网络呼叫的游戏.在更新方法中,我确定需要发送的内容,然后将其添加到要发送的内容列表中.然后我运行网络呼叫.这显然会减慢应用程序的速度.所以我首先尝试在更新中创建这样的新线程,使其在单独的线程上执行:

Thread thread; 
thread = new Thread(
new ThreadStart(DoNetworkThing));
thread.Start();

我认为创建线程有开销等,这导致这甚至更慢.
最后,我创建了一个while(true){DoNetworkThing();}的方法,它将循环并循环运行网络调用(它会检查它是否已经忙于一个,以及是否有东西发送).我在一个线程中调用LoadContent方法的方法,因此它将在自己的线程中与游戏一起运行.
但那也很慢.

那么我做错了什么?这样做的最佳方式是什么?
谢谢

解决方法

我最初尝试在XNA上使用线程时遇到了这个问题 – 添加一个线程会减慢一切.事实证明线程亲和力是个问题.

在Xbox 360上,默认情况下,所有线程都在同一处理器核心上运行;此行为与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上编译!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读