【问题标题】:Multi-Threading XNA GameComponents多线程 XNA GameComponents
【发布时间】:2012-06-26 04:36:29
【问题描述】:

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

  • A 是可见的,或者 B 是可见的。所以只需要调用他们的“Draw”方法之一。
  • AB 都需要启用 - 始终。所以在任何情况下都必须调用每个的“Update”方法。

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

我想知道的是如何在 XNA 中做到这一点。 XNA 框架调用了“更新”和“绘制”方法,所以我不知道把线程放在哪里。有这样做的标准方法吗?

【问题讨论】:

  • xbox360 上的多线程与 PC 略有不同。它必须根据不同的方式进行编码。这是针对一个或另一个还是两者?此外,如果是 PC,则无法保证用户拥有多核 CPU。如果他们有一个单核 CPU,多线程可能会花费时间,而不是节省时间。
  • 目标机器只是一台PC。项目不是游戏,只会有一台机器多核执行,所以一般多线程是没有问题的。

标签: multithreading xna


【解决方案1】:

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

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

附言如果您不介意阅读大量内容,请查看有关 XNA 多线程的 article,它附有一些图表,可以很好地解释它是如何工作的。

【讨论】:

  • 嗯,教程只涉及游戏状态。在我的项目中,我有两个 DrawableGameComponents。他们有自己的更新/绘图。在 Game 类中,我只添加那些组件,例如: Components.Add(new MyGameComponentA(this));框架负责所有更新/绘制调用。
  • 你可以在 Game1 类中创建两个线程(框架负责调用 Game1.cs 的 Update() 和 Draw()),线程对象是私有的,但可以在整个类(类级变量)和每个线程都在 Update() 方法中运行,它们都是并行运行的。我希望这种解释更适合您的情况。
  • 这意味着它们需要以某种方式同步。我会试试这个。
【解决方案2】:

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

使用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 是类级别的变量,您可以管理它们何时处于活动状态。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-17
    相关资源
    最近更新 更多