Rust winit 事件循环运行太频繁

问题描述 投票:0回答:1

我有一个简单的 winit 应用程序,它正在创建一个空窗口并运行 EventLoop:

event_loop.run(move |event, _, control_flow| {
    control_flow.set_wait_until(std::time::Instant::now() + Duration::from_millis(1000));
    match event {
        Event::WindowEvent{ ref event, window_id, } => {},
        Event::MainEventsCleared => {
            window.request_redraw()
        },
        _ => {}
    }
});

在 MacOS 上,此过程使用 100% 的 1 个 CPU 核心。如果我删除了 window.request_redraw 调用,或者当我人为限制线程睡眠时(不管设置 wait until 来控制流量),CPU 使用率会急剧下降到 10% 左右。这表明 wait/wait until 不能正常工作,因为如果我理解正确,我希望每 1 秒看到一次对 request_redraw 的调用。

除了 thread::sleep/wait/wait until 之外,还有什么方法可以限制事件循环运行频率,或者我做错了什么?

performance user-interface rust event-loop winit
1个回答
0
投票

WaitUntil
原因:

当前循环迭代完成时,挂起线程直到另一个事件到达或达到给定时间。

request_redraw

发出一个

Event::RedrawRequested
事件

所以除非我遗漏了一些东西,否则一切都会按预期进行。

因为

request_redraw
导致事件被发出,事件循环立即开始下一次迭代。

也不需要显式调用该方法,因为在

MainEventsCleared

之后

Event::RedrawRequested
,[...] 立即发出

人为地限制该频率只会导致您的应用程序感觉迟钝,然后无法立即响应事件,所以我怀疑这不是您想要的。据我所知

winit
没有提供这样的功能(除了提到的
set_wait
/
set_wait_until
)。

© www.soinside.com 2019 - 2024. All rights reserved.