在多线程游戏中每帧创建新的工作线程是不是很糟糕?

时间:2017-10-08 22:48:24

标签: c++ multithreading game-engine

我已经尝试过多线程游戏引擎。为了举个例子,这里是我的代码的基本结构。

#include <thread>

int main() {

  std::thread physics_thread;
  std::thread particles_thread;
  std::thread graphics_thread;

  while (!shouldClose) {

    physics_thread   = thread(doPhysics,   &someData1);
    particles_thread = thread(doParticles, &someData2);
    graphics_thread  = thread(doGraphics,  &someData3);

    physics_thread.join();
    particles_thread.join();
    graphics_thread.join();

  }

}

这是非常糟糕的做法吗?我在一个相当低功耗的系统上运行linux并且每次更新都创建这些线程非常便宜。但就所有平台而言,这只是一个坏主意吗?

另一方面,我试图不断地使用互斥锁和条件变量来运行工作线程,有时我可以让它工作,但对于我尝试的内容来说,这似乎很荒谬。实现。

1 个答案:

答案 0 :(得分:0)

虽然这看起来很便宜,但事实并非如此。 线程需要一些繁重的工作,如果你知道你将再次需要它们(更不用说多次重复使用它们)了,你应该试着避免它。

经典的解决方案是使用线程池在您需要时立即执行任务,然后让工作人员一直睡到下一次。

拥有N个额外的睡眠线程的成本很低,不会影响应用程序的性能。

这是我写的一个简单但非常强大的单一标题thread pool library