QtWebEngine性能問題

1. 概述

Qt的Qt WebEngine模塊是基於Chromium項目,但是本人在使用QWebEngineView進行Web端的三維渲染(WebGL)時,經過測試發現性能比不上Chrome。查閱了一些資料,記錄一下對這個問題的嘗試。

2. 詳論

2.1. 圖形屬性設置

在Chrome中通過地址chrome://gpu查看使用的GPU的情況:
figure1

而在Qt的QWebEngineView中同樣打開chrome://gpu查看:
figure2

可以看到兩者的GL_RENDERER是不一樣的,原生的Chrome採用的是ANGLE渲染的,而不是像Qt WebEngine那樣採用顯卡驅動中OpenGL4.6渲染。

根據參考[1],ANGLE是Google的一個開源項目,目的是將OpenGL ES API調用映射到 Vulkan、桌面OpenGL、OpenGL ES、Direct3D 9 和 Direct3D 11中。文中還提到了ANGLE是Windows平臺上Google Chrome和Mozilla Firefox的默認WebGL後端:
figure3

那麼問題可能在於這裏,一般會認爲使用D3d的性能比OpenGL要高。按照參考[2]中所述,我們可以將Qt的圖形屬性設置成ANGLE:
figure4

具體的代碼爲:

QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
//...
QApplication a(argc, argv);
//...

根據參考[2]中所述,這樣會讓ANGLE自動選擇最合適的圖形接口。這時通過chrome://gpu查看如下:
figure5

這時的ANGLE已經啓用了,並且調用了D3d11。不過很可惜,經過測試,我這邊性能並沒有提高,並且在後臺會報錯。

更進一步的,參考[2]中還提到了可以通過環境變量QT_ANGLE_PLATFORM來選擇d3d11、d3d9或者warp,來選擇具體的圖形接口實現。可惜這三種配置對我都沒什麼效果。

2.2. 硬件加速設置

參考[3]和參考[4]提到了Chromium有一些命令行參數,用於進行硬件加速。例如"--ignore-gpu-blacklist", "--enable-gpu-rasterization", "--enable-native-gpu-memory-buffers", "--num-raster-threads=4"。參考[5]中提到了具體的設置方法:

qputenv("QTWEBENGINE_CHROMIUM_FLAGS", "--ignore-gpu-blacklist");
//...
QApplication a(argc, argv);
//...

但是很可惜,經過測試,我這邊性能還是並沒有提高。

2.3. Qt6

在Qt的一篇官方博客,也就是參考[6]中,提到了一些信息:

figure6
figure7

似乎目前Qt的ANGLE並沒有真正渲染到D3D上,相應的硬件加速也沒有作用。如果可以,儘量跟進Qt6的最新版,可能會解決這個性能問題。

3. 參考

  1. ANGLE - Almost Native Graphics Layer Engine
  2. Qt for Windows - Requirements
  3. Investigate Chromium GPU flags
  4. Enable hardware acceleration with QtWebEngine
  5. Setting arguments for QtWebEngineProcess
  6. Qt WebEngine in Qt 6
  7. Qt5: can WebGL work with ANGLE on Windows via QtWebEngine?
  8. qt QWebEngineView 和 quick 渲染的問題的解決
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章