应该在游戏循环c++中调用std::async吗

Should std::async be called in a game loop c++?

本文关键字:std 调用 async c++ 游戏 循环      更新时间:2023-10-16

对std::async的调用效率如何?它可以用来在游戏循环中发布任务吗?

我希望我所有的输入检测都在一个单独的线程上,并在主线程中的游戏循环中的某个点同步,这样我就可以轮询输入。

我能想到的唯一方法是将我的任务分解为输入检测,并在实际游戏循环开始时使用std::async调用它们,然后在循环的稍后调用wait()来同步数据,但我希望循环的每次迭代都有同样的行为,所以这个调用一定很昂贵。。。

是这样吗?

假设它写得很好,那么std::async(std::launch::async, ...)应该不会比小堆分配和构造std::thread更昂贵。如果创建一个新的std::thread来完成这项工作对您来说足够高效,那么std::async将足够高效,但将省去编写同步以将结果返回到主线程的麻烦。

如果为每件作品创建一个新的std::thread是不合适的,那么std::async可能也不合适。

(注意:请记住,除非您指定std::launch::async作为启动策略,否则无法保证任务异步执行,它可能会推迟到您在返回的future上调用get()。)

至少在IMO中,您应该在轮询和异步操作之间下定决心。

如果要进行轮询,那么使用std::async是多余的。无论如何,你都要从主线程进行轮询,所以你最好让它直接轮询它关心什么,然后再处理它。使用std::async启动其他东西只会增加将数据发送到主线程的延迟。

如果您要使用std::async,那么您应该采取一种完全不同的方法:获得输入的线程独立运行。当他们找到一些输入时,他们将其发送到主线程,并告诉它有一些输入要处理(例如,通过设置信号量)。然后主线程对该信号量作出反应,检索输入数据(例如,从队列中)并对其进行处理

在后一种情况下,轮询是毫无意义的:如果输入线程没有告诉主线程一些输入数据,那么根本没有。在这种情况下,轮询输入数据是毫无意义的——您已经知道没有了。