文档章节

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

reter
 reter
发布于 10/21 19:56
字数 434
阅读 104
收藏 0

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

查询的资料如下:

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

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

位置: https://github.com/Gekkio/imgui-rs/blob/master/imgui-gfx-examples/examples/support/mod.rs


impl System {
    pub fn main_loop<F: FnMut(&mut bool, &mut Ui)>(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 {
                //检测到最小化,不要让渲染线程跑太快,如果需要在渲染线程处理其他高频率的事件,应该使用新的线程。
                //如果恰好是CPU密集的事件,那么就可以适当缩短睡眠时间
                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();
        }
    }
}

© 著作权归作者所有

reter
粉丝 3
博文 65
码字总数 32293
作品 0
惠州
程序员
私信 提问
Go和Rust简单计算性能PK

迁移自CSDN:http://blog.csdn.net/erlib/article/details/52078417 作为Go语言的狂热粉丝最近听说了同样鼎鼎大名的现代化语言-Rust,看了介绍后,发现Rust绝对是一门非常有潜力的系统级语言...

孙飞撩技术
2017/10/23
0
0
rust on android

Is it possible to write a GUI Android app in rust? (self.rust) submitted 4 months ago by rmc Hi all, I'm new to rust, so forgive me if this is a really simple question, but is i......

MtrS
2015/03/14
936
1
Rust 的底层图形抽象层潜力巨大:支持多平台且性能高

由 Mozilla 主导开发的 Rust 编程语言的 "GFX-RS" 计划继续致力于在 Rust 中暴露一个通用的“类似 Vulkan”的图形 API,而后者将为 Vulkan, OpenGL, Metal 和 Direct3D 11/12 提供后端支持,...

局长
2018/08/11
5K
10
Android 反向网络连接工具--Gnirehtet

Gnirehtet 该项目通过 adb 为 Android 设备提供 reverse tethering(反向网络连接),允许设备在插入计算机后,使用计算机的网络而不用消耗自身的流量。适用于 GNU / Linux、Windows 和 Mac ...

匿名
2017/09/25
1K
10
Redox 0.4.1 发布,可用性有显著变化

redox 0.4.1发布,可用性有显著变化。Redox 是一个用 Rust 语言编写的类 UNIX 操作系统 , 它的目标是把 Rust 语言的创新带入到一个现代的微内核和全系列的应用程序。 下载地址 redox_0.4.1....

h4cd
2018/04/02
2.1K
5

没有更多内容

加载失败,请刷新页面

加载更多

交换两数(函数)

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> void Exchange(int* x, int* y){ int tmp = 0; tmp = *x; *x = *y; *y = tmp; } int main(){ int a; int b; scanf......

Lxxxxx256
10分钟前
1
0
给 K8s API “做减法”:阿里巴巴云原生应用管理的挑战和实践

作者 | 孙健波(天元) 阿里巴巴技术专家 本文整理自 11 月 21 日社群分享,每月 2 场高质量分享,点击加入社群。 早在 2011 年,阿里巴巴内部便开始了应用容器化,当时最开始是基于 LXC 技术...

阿里巴巴云原生
今天
6
0
数据平面

3.1数据平面的任务 解析数据包头 转发数据包到某些端口 通过查询由控制平面所生成的转发表 传统网络数据平面 数据包--输入端口---拆封和解析,转发策略匹配,转发调度---输出端口(协议相关,...

Firefly-
昨天
6
0
如何高效的阅读uni-app框架?(建议收藏)

作者 | Jeskson 来源 | 达达前端小酒馆 uni-app的框架,配置:page.json,manifest.json,package.json,vue.config.js。脚本,应用程序,main.js。日志打印,定时器,生命周期,页面,页面通...

达达前端小酒馆
昨天
7
0
实现原理专题--存储器的实现(三)

计算机实现原理专题--存储器的实现(二)中描述了一种电平触发器,但是某些应用需要在保持位从0到1变化的过程中对数据端进行保存。这种触发器叫边沿触发器。 一开始Q为0,时钟信号为0。当数据...

FAT_mt
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部