在继续libuv之前如何处理所有可用的数据报

时间:2018-08-23 01:31:21

标签: c++ sockets udp libuv

我有一个图形/网络循环,如下面的伪代码所示:

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或跨平台中的功能。

0 个答案:

没有答案