Red*_*ctk 1 performance user-interface event-loop rust winit
我有一个简单的 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()
},
_ => {}
}
});
Run Code Online (Sandbox Code Playgroud)
在 MacOS 上,此进程 100% 使用 1 个 CPU 核心。如果我删除 window.request_redraw 调用,或者当我人为地限制线程睡眠时(无论设置等待直到控制流程),CPU 使用率会急剧下降到 10% 左右。这表明 wait/wait Until 无法正常工作,因为如果我理解正确的话,我希望每 1 秒才会看到对 request_redraw 的调用。
除了 thread::sleep/wait/wait Until 之外,还有什么方法可以限制事件循环运行频率,或者我做错了什么?
WaitUntil原因:
当当前循环迭代完成时,挂起线程,直到另一个事件到达或达到给定时间。
发出一个
Event::RedrawRequested事件
所以除非我错过了一些东西,否则一切都会按预期进行。
因为request_redraw会导致事件被发出,所以事件循环立即开始下一次迭代。
也不需要显式调用该方法,因为之后MainEventsCleared
Event::RedrawRequested, [...] 立即发出
人为地限制频率只会导致您的应用程序感觉迟钝,然后无法立即响应事件,所以我怀疑这就是您想要的。据我所知,winit不提供这样的功能(除了提到的set_wait/ set_wait_until)。
| 归档时间: |
|
| 查看次数: |
728 次 |
| 最近记录: |