调用 std::async 的效率如何?它可以用于在游戏循环中发出任务吗?
我希望我的所有输入检测都在一个单独的线程上,并在我的主线程的游戏循环中的某个点同步,以便我可以轮询输入。
我能想到的唯一方法是拆分我的输入检测任务,并std::async
在实际游戏循环开始时使用它们调用它们,然后wait()
在循环中稍后调用以同步数据,但我希望每次迭代都具有相同的行为循环,所以这个调用一定很昂贵......
是这样吗?
调用 std::async 的效率如何?它可以用于在游戏循环中发出任务吗?
我希望我的所有输入检测都在一个单独的线程上,并在我的主线程的游戏循环中的某个点同步,以便我可以轮询输入。
我能想到的唯一方法是拆分我的输入检测任务,并std::async
在实际游戏循环开始时使用它们调用它们,然后wait()
在循环中稍后调用以同步数据,但我希望每次迭代都具有相同的行为循环,所以这个调用一定很昂贵......
是这样吗?
至少在 IMO,您应该在轮询和异步操作之间下定决心。
如果您要进行投票,那么使用std::async
是多余的。无论如何,您都会从主线程进行轮询,因此您不妨直接让它轮询它关心的内容并完成它。使用std::async
启动其他东西只会增加将数据获取到主线程的延迟。
如果您要使用std::async
,那么您应该采用一种完全不同的方法:获取输入的线程独立运行。当他们找到一些输入时,他们将其发送到主线程,并告诉它有一些输入要处理(例如,通过设置信号量)。然后主线程对该信号量做出反应,检索输入数据(例如,从队列中)并处理它。
在后一种情况下,轮询是没有意义的:如果输入线程没有告诉主线程一些输入数据,那么根本就没有。在这种情况下,轮询输入数据是没有意义的——你已经知道没有。
假设它写得很好,那么std::async(std::launch::async, ...)
应该不会比一个小的堆分配和构造一个std::thread
. 如果创建一个新std::thread
的来完成这项工作对您来说足够高效,那么std::async
将足够高效,但会省去您编写同步以将结果返回到主线程的麻烦。
如果为每件作品创建一个新std::thread
的不合适,那么std::async
可能也不合适。
(请记住,除非您指定std::launch::async
启动策略,否则不能保证任务异步执行,它可能会被推迟到您调用get()
返回的未来。)