在多线程游戏的每个帧中创建新的工作线程是否糟糕?
问题描述:
我一直在尝试使用多线程游戏引擎。为了举例,这里是我的代码的基本结构。在多线程游戏的每个帧中创建新的工作线程是否糟糕?
#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,每次更新创建这些线程都很便宜。不过就所有平台而言,这是一个坏主意吗?
在一个侧面说明我试图做不断运行工作线程与互斥锁和条件变量出wazoo,有时我可以得到它的工作,但它似乎荒谬的复杂,我试图实现。
答
虽然这看起来不贵,但情况并非如此。 线程需要一些繁重的工作,如果你知道你会再次需要它们(更不用说重复使用它们了),你应该尽量避免它。
经典的解决方案是使用线程池在需要时正确执行任务,然后让工作人员休眠,直到下一次。
拥有N个附加睡眠线程的开销很小,不会影响应用程序的性能。
这是一个简单但非常强大的单一标题thread pool library我写的。
重新分配循环中的资源绝对是一种不好的做法。在这种特殊情况下,你可以利用某种类型的线程池。然而毫无意义的重新分配并不是这个片段中最大的问题。这种循环使工作线程作业严格同步,而不是异步运行。 – VTT
创建线程很昂贵。 –
复杂的解决方案必定会更有效率。这取决于你的应用程序,如果你真的需要额外的效率与否。为什么不做一些测试,看看有多少创建线程可以消除帧速率?然后决定是否需要创建更复杂的解决方案。 – Galik