• Linux系统中Qt应用程序确保使用集成显卡进行图形渲染


    背景:有一个Qt开发的应用程序,使用了Qt的OpenGL模块来渲染QImage加载的图片,当应用程序切换到图片渲染界面时,系统CPU占用率立马到了100%多,容易造成程序卡顿,可设备是自带集成显卡的,期望效果是用集成显卡进行图形渲染,以解决软件运行卡顿的问题。

    使用QOpenGLWidget(调用GPU)渲染QImage加载的图片

    1.排查问题

    1.1 查看显示设备信息

    lshw -C display
    
    • 1

    指令"lshw -C display"是用于在Linux系统中查看显示设备信息的命令。具体解释如下:
    "lshw"是"list hardware"的缩写,用于列出系统中的硬件信息。
    “-C display"是指定了要列出的硬件类别为"display”,即显示设备。
    因此,执行该指令后,系统会列出所有显示设备的详细信息,包括显示器、显卡等相关硬件信息

    如:

    lshw -C display
      *-display               
           description: VGA compatible controller
           product: Intel Corporation
           vendor: Intel Corporation
           physical id: 2
           bus info: pci@0000:00:02.0
           version: 01
           width: 64 bits
           clock: 33MHz
           capabilities: pciexpress msi pm vga_controller bus_master cap_list rom
           configuration: driver=i915 latency=0
           resources: irq:149 memory:80000000-80ffffff memory:70000000-7fffffff ioport:3000(size=64) memory:c0000-dffff
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这些信息表示计算机的显示控制器是由英特尔公司制造的,是VGA兼容控制器。它使用PCI总线连接,具有64位宽度和33MHz时钟。它支持PCI Express、MSI、电源管理和VGA控制器功能,并且是总线主控设备。驱动程序为i915,资源包括内存地址、IO端口和ROM。
    根据上面的信息,这个显示控制器是由英特尔公司制造的,因此它是集成显卡,而不是独立显卡。
    driver=i915 表明系统正在使用 i915 驱动程序来管理 Intel 集成显卡

    1.2 查看设备显卡信息

    lspci | grep -i vga
    00:02.0 VGA compatible controller: Intel Corporation Device 4555 (rev 01)
    
    • 1
    • 2

    这个命令会列出系统中所有的显卡设备,如果设备的集成显卡被正确识别,应该能在输出中看到相关的信息,比如本设备的集成显卡型号是Intel Corporation

    lspci -k | grep -A 2 -i "VGA"
    00:02.0 VGA compatible controller: Intel Corporation Device 4555 (rev 01)
    	DeviceName: Onboard - Video
    	Subsystem: Intel Corporation Device 7270
    
    • 1
    • 2
    • 3
    • 4

    上面信息表示当前系统中存在一个由Intel Corporation制造的VGA兼容控制器,设备型号为4555,版本号为01。"DeviceName"和"Subsystem"是设备的附加信息。
    这个输出表明当前系统已检测到并识别了集成显卡,并且驱动程序已加载。因此,可以初步判断驱动程序已正确安装。

    2.测试Demo

    • 终端运行:glxgears
      在这里插入图片描述

    此时再打开一个终端,监控CPU的使用情况:top -Hw
    在这里插入图片描述
    会发现有个应用程序 llvmpipe 的占用率会立马上升,那就说明该设备图形渲染使用的的CPU而不是显卡。

    • 查看OpenGL渲染器信息:glxinfo | grep "OpenGL renderer"
      PS:如果输入glxinfo | grep "OpenGL renderer"指令后报错:
    Error: unable to open display 
    
    • 1

    需要输入如下指令:

    export DISPLAY=:0
    glxinfo | grep "OpenGL renderer"
    
    OpenGL renderer string: Gallium 0.4 on llvmpipe (LLVM 4.0, 128 bits)
    
    • 1
    • 2
    • 3
    • 4

    上面信息表示当前系统当前使用的 OpenGL 渲染器Gallium 0.4 on llvmpipe。这是一个通用的软件渲染器,它不依赖于显卡硬件,而是使用 CPU 来进行图形渲染

    3.解决方法

    3.1 确认设备带集显且驱动安装正确

    如果系统本来应该使用硬件加速的 OpenGL 渲染器,但却显示使用了软件渲染器,那么可能是由于显卡驱动没有正确安装或配置所致。可以尝试更新显卡驱动或重新安装显卡驱动,以解决这个问题。
    通过如下方法确认:

    lspci -k | grep -A 2 -i "VGA"
    
    • 1

    3.2 修改 xorg.conf 配置文件

    • 1.首先确认/etc/X11/xorg.conf文件存在(PS:如果不存在可以新建一个,按照本方法进行尝试,如果修改后黑屏或者无效,就把该文件删除进行恢复
    • 2.xorg.conf文件解读
    Section "Device"
    	Identifier "Intel"
    	Driver "intel"
    #	Option "AccelMethod" "uxa"
    EndSection
    
    • 1
    • 2
    • 3
    • 4
    • 5

    "AccelMethod" 是 Xorg 配置文件中用于指定 2D 加速方法的选项。在 Intel 集成显卡的配置中,通常会使用 “uxa” 和 “sna” 这两个选项。
    "uxa":这代表 “Unified Acceleration Architecture”,是一种较早期的 2D 加速方法。它使用一个统一的架构来处理图形渲染,能够提供一定程度的加速效果。“uxa” 在旧的 Intel 集成显卡上表现良好,但在一些较新的硬件上可能表现不佳。
    "sna":这代表 “Sandybridge’s New Acceleration”,是一种更新的 2D 加速方法,专门针对 Intel Sandy Bridge 架构的集成显卡进行了优化。“sna” 采用了一些新的技术和优化,可以在支持的硬件上提供更好的性能和稳定性。

    • 3.修改xorg.conf文件,修改后如下:
    Section "Device"
    	Identifier "Intel"
    	Driver "intel"
    	Option "AccelMethod" "sna"
    EndSection
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这个修改后的配置中,我们取消了对 “AccelMethod” 选项的注释,并将其设置为 “sna”。这将指示系统使用 Intel 集成显卡的 “sna” 加速方法进行图形渲染。
    完成修改后,可以保存配置文件并重新启动 X 服务器,或者注销并重新登录用户,以使更改生效。请确保在进行任何配置更改之前备份重要数据,以避免不必要的问题可以进行恢复。

    • 4.修改完成后,重启设备或者重启桌面管理程序
      如:sudo service lightdm restart

    3.3 升级系统内核

    查看内核:uname -r

    uname -r
    5.15.137-rt71
    
    • 1
    • 2

    PS:我一开始使用的是Xubuntu16.04的系统,内核版本是4.14-rt,后来升级到了5.15.137-rt71还是不行,于是索性直接升到了Xubuntu22.04系统,内核版本是6.2.0-36-generic,再次使用指令查看,发现解决了。。。

    glxinfo | grep "OpenGL version"
    OpenGL version string: 3.0 Mesa 17.0.7
    
    • 1
    • 2
  • 相关阅读:
    【angular】TodoList小项目(已开源)
    java毕业设计爱心互助及物品回收管理系统Mybatis+系统+数据库+调试部署
    《SprigBoot篇》09.Spring Data JPA简介与SpringBoot整合超详细教学
    eBPF 实践 -- 网络可观测
    【GWO-KELM预测】基于灰狼算法优化核极限学习机回归预测研究(matlab代码实现)
    【Kafka】聊聊如何做Kafka集群部署方案
    大数据Hadoop之——总结篇
    【Rust指南】基础语法|基本数据类型|复合数据类型
    C语言——学生信息管理系统
    安卓学习:广播
  • 原文地址:https://blog.csdn.net/qq_45445740/article/details/134495914