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