代码之家  ›  专栏  ›  技术社区  ›  Azat

XNA游戏中的多线程

  •  2
  • Azat  · 技术社区  · 15 年前

    在一个简单的2dxna游戏中,我在哪里可以使用多线程?如有任何建议,我们将不胜感激

    5 回复  |  直到 15 年前
        1
  •  10
  •   Reed Copsey    15 年前

    嗯,有很多选择-

    大多数游戏使用多功能阅读,例如:

    1. 物理
    2. 网络
    3. 资源加载
    4. 人工智能/逻辑更新(如果你在游戏的“更新”阶段有很多计算)

    您真的需要考虑您的特定游戏架构,并决定使用多线程从何处获益最大。

        2
  •  3
  •   Dan Olson    15 年前

    有些游戏使用多线程渲染器作为核心设计理念。

    例如。。。线程1计算所有的游戏逻辑,然后将此信息发送到线程2。线程2预先计算显示列表并将其传递给GPU。线程1在GPU后面运行2个帧,线程2在GPU后面运行一个帧。

    优点是理论上你可以在一个框架内完成两倍的工作。剥皮可以在CPU上完成,并且可以在CPU和GPU时间方面变得“免费”。它确实需要对大量数据进行双重缓冲,并仔细构建引擎流,以便在必要时(并且仅在必要时)所有线程都停止运行。

    除此之外,现在一种非常常见的技术是运行许多“工作线程”。具有公共接口的任务可以添加到共享(线程安全)队列中,并由工作线程执行。然后,主游戏线程在需要结果之前将这些任务添加到队列中,并继续进行其他处理。当最终需要结果时,主线程可以暂停,直到工作线程完成所有必需的任务。

    例如,一个昂贵的for循环可以更改为已使用的任务。

    // Single threaded method.
    for (i = 0; i < numExpensiveThings; i++)
    {
      ProcessExpensiveThings (expensiveThings[i]);
    }
    
    // Accomplishes the same work, using N worker threads.
    for (i = 0; i < numExpensiveThings; i++)
    {
      AddTask (ProcessExpensiveThingsTask, i);
    }
    WaitForAll (ProcessExpensiveThingsTask);
    

    只要保证processExpensive things()对于其他调用是线程安全的,就可以这样做。如果你有80个东西,每个1毫秒,8个工作线程,你已经节省了大约70毫秒。(好吧,不是真的,但这是一个很好的手波近似值。)

        3
  •  0
  •   ironic    15 年前

    有很多地方可以应用:人工智能,对象交互,多人游戏等。这取决于你的具体游戏。

        4
  •  0
  •   Drew Dormann    15 年前

    为什么要使用多线程?

    如果是为了实践,一个合理而简单的模块放在自己的线程将是健全的系统,因为沟通主要是单向的。

        5
  •  0
  •   Oofpez    13 年前