QtWebEngine效能問題

charlee44發表於2022-04-30

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 渲染的問題的解決

相關文章