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