QtWebEngine性能問題
- 2022 年 4 月 30 日
- 筆記
- Chrome, Chromium, Qt, QtWebEngine
1. 概述
Qt的Qt WebEngine模組是基於Chromium項目,但是本人在使用QWebEngineView進行Web端的三維渲染(WebGL)時,經過測試發現性能比不上Chrome。查閱了一些資料,記錄一下對這個問題的嘗試。
2. 詳論
2.1. 圖形屬性設置
在Chrome中通過地址chrome://gpu查看使用的GPU的情況:
而在Qt的QWebEngineView中同樣打開chrome://gpu查看:
可以看到兩者的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後端:
那麼問題可能在於這裡,一般會認為使用D3d的性能比OpenGL要高。按照參考[2]中所述,我們可以將Qt的圖形屬性設置成ANGLE:
具體的程式碼為:
QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);
//...
QApplication a(argc, argv);
//...
根據參考[2]中所述,這樣會讓ANGLE自動選擇最合適的圖形介面。這時通過chrome://gpu查看如下:
這時的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]中,提到了一些資訊:
似乎目前Qt的ANGLE並沒有真正渲染到D3D上,相應的硬體加速也沒有作用。如果可以,盡量跟進Qt6的最新版,可能會解決這個性能問題。
3. 參考
- ANGLE – Almost Native Graphics Layer Engine
- Qt for Windows – Requirements
- Investigate Chromium GPU flags
- Enable hardware acceleration with QtWebEngine
- Setting arguments for QtWebEngineProcess
- Qt WebEngine in Qt 6
- Qt5: can WebGL work with ANGLE on Windows via QtWebEngine?
- qt QWebEngineView 和 quick 渲染的問題的解決