我有一个图形/网络循环,如下面的伪代码所示:
while (window.isOpen() || uv_run(uv_default_loop(), UV_RUN_NOWAIT)) {
update_network();
update_simulation();
render_vsync();
// blocks to maintain ~60Hz
}
这很好,但是我的uv_run
每次调用仅处理一个uv_udp_recv_cb
。这意味着由于阻塞渲染循环,我每秒只能接收60个数据报。
我每秒向循环发送60多个小数据报,导致积压,循环突然跟不上。
Q:如何在继续之前让libuv的uv_run
处理内核中保存的所有数据-即让它在一次调用中处理所有缓冲或可用的数据报,直到没有留下来recv
?
我可以这样做以清除积压并在每次迭代中处理更多的东西,但是如果没有足够的数据包,那我将浪费时间搜索不存在的数据报,并将自己限制为每秒600个数据报。
while (window.isOpen()) {
// process up to 10 datagrams per loop
for (int i = 0; i < 10; i++) {
uv_run(uv_default_loop(), UV_RUN_NOWAIT);
}
update_network();
update_simulation();
render_vsync();
// blocks to maintain ~60Hz
}
是否还有其他快速替代方法可以处理所有可用的数据报,直到下一个循环,或者弄清楚当前有多少个数据报可供读取?
我需要避免仅在特定操作系统上可用的功能,并且至少应该更喜欢libuv或跨平台中的功能。