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

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

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

目录

  • 1.排查问题
    • 1.1 查看显示设备信息
    • 1.2 查看设备显卡信息
  • 2.测试Demo
  • 3.解决方法
    • 3.1 确认设备带集显且驱动安装正确
    • 3.2 修改 xorg.conf 配置文件
    • 3.3 升级系统内核

1.排查问题

1.1 查看显示设备信息

lshw -C display

指令"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

这些信息表示计算机的显示控制器是由英特尔公司制造的,是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)

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

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

2.测试Demo

  • 终端运行:glxgears
    Linux系统中Qt应用程序确保使用集成显卡进行图形渲染_第1张图片

此时再打开一个终端,监控CPU的使用情况:top -Hw
Linux系统中Qt应用程序确保使用集成显卡进行图形渲染_第2张图片
会发现有个应用程序 llvmpipe 的占用率会立马上升,那就说明该设备图形渲染使用的的CPU而不是显卡。

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

需要输入如下指令:

export DISPLAY=:0
glxinfo | grep "OpenGL renderer"

OpenGL renderer string: Gallium 0.4 on llvmpipe (LLVM 4.0, 128 bits)

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

3.解决方法

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

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

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

3.2 修改 xorg.conf 配置文件

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

"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

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

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

3.3 升级系统内核

查看内核:uname -r

uname -r
5.15.137-rt71

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

你可能感兴趣的:(Xubuntu,C++,QT,linux,qt,图形渲染)