cpu高 rust腐蚀_Rust:最小化窗口后 CPU占用率高 (winit,glutin,imgui-rust)

在使用imgui-rust进行界面绘制时,发现窗口最小化后CPU占用率升高。问题源于最小化后渲染后端持续运行,导致无用渲染和事件拉取。解决方案是检测到窗口最小化时,使渲染线程休眠,减少不必要的执行,从而降低CPU占用。
摘要由CSDN通过智能技术生成

最近试着用 imgui-rust 绘制界面,发现窗口最小化后CPU占用会增大。

查询的资料如下:

原因: 最小化后渲染后端不受控制的运行,imgui 进行许多无用的渲染,EventsLoop不断的拉取无用事件。

解决办法: 检测到最小化后,让当前渲染线程的休眠,不要过快的执行。

impl System {

pub fn main_loop(self, mut run_ui: F) {

let System {

mut events_loop,

mut imgui,

mut platform,

mut render_sys,

..

} = self;

let mut encoder: gfx::Encoder<_ _> = render_sys.factory.create_command_buffer().into();

let mut last_frame = Instant::now();

let mut run = true;

let mut minimized = true;

while run {

events_loop.poll_events(|event| {

platform.handle_event(imgui.io_mut(), render_sys.window(), &event);

if let Event::WindowEvent { event, .. } = event {

match event {

WindowEvent::Resized(size) => {

if size.height as usize == 0 && size.width as usize == 0 {

//最小化

minimized = true;

println!("minimized");

} else {

if minimized {

//从最小化恢复

println!("resume from minimized");

}

minimized = false;

}

render_sys.update_views(size);

},

WindowEvent::CloseRequested => run = false,

_ => (),

}

}

});

if minimized {

//检测到最小化,不要让渲染线程跑太快,如果需要在渲染线程处理其他高频率的事件,应该使用新的线程。

std::thread::sleep(std::time::Duration::from_millis(100));

//continue;

}

let io = imgui.io_mut();

platform

.prepare_frame(io, render_sys.window())

.expect("Failed to start frame");

last_frame = io.update_delta_time(last_frame);

let mut ui = imgui.frame();

run_ui(&mut run, &mut ui);

if let Some(main_color) = render_sys.main_color.as_mut() {

encoder.clear(main_color, [1.0, 1.0, 1.0, 1.0]);

}

platform.prepare_render(&ui, render_sys.window());

let draw_data = ui.render();

if let Some(main_color) = render_sys.main_color.as_mut() {

render_sys

.renderer

.render(&mut render_sys.factory, &mut encoder, main_color, draw_data)

.expect("Rendering failed");

}

encoder.flush(&mut render_sys.device);

render_sys.swap_buffers();

render_sys.device.cleanup();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值