多线程XNA GameComponents

时间:2012-03-20 21:20:56

标签: multithreading xna

我正在开发一个XNA项目,其中有两个 DrawableGameComponents A B ,具有以下约束:

  • A 可见,或 B 可见。因此,只需要调用其中一个“ Draw ”方法。
  • 需要启用 A B - 始终。因此,必须在所有情况下调用每个方法的“更新”方法。

目前, A B 都在同一个线程中执行。但是,它们的“更新”方法是非常强大的CPU。由于两个GameComponents不需要相互通信,并且两个GameComponents都不需要共享任何数据,因此很容易并行化它们。

我想知道的是如何在XNA中做到这一点。 “更新”和“绘制”方法由XNA Framework调用,因此我不知道将线程放在何处。有没有一种标准的方法呢?

2 个答案:

答案 0 :(得分:1)

通常这是通过游戏状态管理来完成的,其中Game1类(默认类)用于调用其他类的Update()和/或Draw()(游戏组件)< / p>

看看xnadevelopment游戏状态管理教程,他们描述了如何调用不同的更新和不同类的绘制,希望你会看到可以在Game1类中实现多线程(默认自动创建的XNA类)

P.S。如果你不介意做很多阅读,请看一下XNA多线程上的这个article,它附带一些解释它如何工作的图表。

答案 1 :(得分:0)

您尚未指定是否需要同时运行两个Update,因此我假设只有一个组件是需要绘制的。

使用DrawableGameComponents它们会自动与您的Game对象同步,但是,如果您存储对每个组件的引用,而不是在没有存储引用的情况下实例化它们,例如:

componentOne = new FirstComponenet(this);
Components.Add(componentOne);
componentTwo = new SecondComponent(this);
Components.Add(componentTwo);
// Immediately disable componetTwo
componentTwo.Enabled = false; // Prevents Update from firing
componentTwo.Visible = false; // Prevents Draw from firing (for Drawable components only)

然后你可以让XNA按照正常情况管理Update / Draw循环。 componentOnecomponentTwo是类级变量,您可以管理每个变量的活动时间。

同样,这是基于这样的假设,即你不需要在另一个人的同时更新。