背景:有一个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
此时再打开一个终端,监控CPU的使用情况:top -Hw
会发现有个应用程序 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