应该在游戏循环c++中调用std::async吗
Should std::async be called in a game loop c++?
对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
,那么您应该采取一种完全不同的方法:获得输入的线程独立运行。当他们找到一些输入时,他们将其发送到主线程,并告诉它有一些输入要处理(例如,通过设置信号量)。然后主线程对该信号量作出反应,检索输入数据(例如,从队列中)并对其进行处理
在后一种情况下,轮询是毫无意义的:如果输入线程没有告诉主线程一些输入数据,那么根本没有。在这种情况下,轮询输入数据是毫无意义的——您已经知道没有了。
- 为什么 std::unique 不调用 std::sort?
- std::cout.imbue()多重调用
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 从类型std::函数传递变量失败,尽管调用方期望的类型完全相同
- 如果 std::vector::clear() 不是静态的,如何在没有实例的情况下调用它?
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 使用 std::variant<...时调用 BaseState 函数而不是派生函数>
- 类型擦除的std::function与虚拟函数调用的开销
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- std::调用,未找到匹配的重载函数
- 线程 std::调用未知类型,无法专门化函数错误
- 如何使用 std:: 调用函数中的函数?
- 使用经典重载解析规则创建依赖于 std::调用的重载集类
- std::调用 end() 时出现多映射错误
- std::调用函数时找不到函数构造函数
- std::调用没有匹配的重载函数在VS 2015中发现错误