Qt 渲染機制

作者:billy
版權聲明:著作權歸作者所有,商業轉載請聯繫作者獲得授權,非商業轉載請註明出處

前言

衆所周知,Qt 是一個跨平臺C++圖形用戶界面應用程序開發框架,我們使用 Qt 最多的就是用來開發GUI程序。在HMI開發過程中,最直接影響人們審美的就是程序的流暢程度,即應用程序在交互過程中是否會出現延遲或者卡頓。而這些都涉及到了一個知識點,就是 Qt 中的渲染機制,瞭解 Qt 是如何完成渲染的,會給我們的開發帶來很大的幫助。

瞭解 OpenGL 渲染

GPU(GraphicProcessing Unit)圖形處理器,其最大的作用就是進行各種繪製計算機圖形所需的運算,包括頂點設置、光影、像素操作等。GPU使顯卡減少了對CPU的依賴,並進行部分原本CPU的工作

實際應用中圖像的生成流程大致如下:
首先從硬盤中讀取模型,CPU分類後將多邊形信息交給GPU,GPU再時時處理成屏幕上可見的多邊形,但是沒有紋理只有線框。CPU計算出模型後,GPU將模型數據放進顯存,顯卡同時也爲模型貼材質,給模型上顏色。CPU相應從顯存中獲取多邊形的信息。然後CPU計算光照後產生的影子的輪廓。等CPU計算出後,顯卡的工作又有了,那就是爲影子中填充深的顏色。周而復始,完成CPU與GPU之間的數據交換。

在這裏插入圖片描述
OpenGL是一個跨平臺的圖形接口,OpenGL是和顯卡有關係的,只有顯卡提供支持,纔可以用OpenGL的,當然OpenGL是和顯卡廠商有協商的。有了OpenGL,我們就可以用顯卡來處理關於圖形圖像的東西,然後交給顯示服務器進行顯示。

這裏有個問題需要注意,就是OpenGL不能直接和顯示服務器進行通信,也就是說我們用OpenGL處理的圖形圖像是不能直接給顯示服務器的,這中間得有一個東西來進行處理,這個中間件根據平臺,windows上叫做wgl,linux上叫做glx,macos上是agl。好了,現在我們就可以用窗口來顯示OpenGL處理的圖形了,也就是我們常說的用OpenGL來進行渲染。

之後爲了將wgl,glx,agl這些東西統一起來,實現平臺統一,就誕生了glfw,glu等東西,這些東西封裝了wgl,glx,agl並且結合了各平臺的顯示服務器來創建窗口,可以讓我們用一套代碼來實現跨平臺使用OpenGL在窗口中進行渲染。

然後問題又來了,因爲OpenGL在各個操作系統上的接口有的不一致,如果在不同平臺上編譯可能不相互兼容。於是又誕生了glew和glad這類東西來實現各個操作系統OpenGL接口的統一,結合上面提到的,就可以實現全面的跨平臺了。

Qt 中的渲染

  1. QWidget
    在Qt5.0之前,GUI開發使用的都是現在的 QWidget,ui描述界面佈局結合C++細節實現,實現效果很好,界面開發的速度還算中肯。但在移動開發面前就不靈了,因爲 QWidget 本質是使用平臺繪圖工具來繪繪製界面,而每個界面的繪製都需要各自有自己的繪製狀態,這個消耗對於手機這類移動平臺來說是不可忽視的 。
    在 QWidget 這一類中,基本上控件的實現都是對各個平臺上的對應的控件的封裝。QWidget 中使用 QWindow 來創建窗口,而單獨的 QWindow 內是不能使用系統插件的,只提供窗口,所以理論上 QWindow 中是可以直接用 OpenGL 來進行繪圖的。Qt 爲了以後的發展和2D,3D繪圖性能的提升以應對遊戲等開發需求,在Qt5.0以後將 QWidget 系的東西從gui模塊中單獨抽出來作爲widgets模塊,這也在情理之中。可參考 Qt中 gui 模塊和 widgets 模塊的區別

  2. QGraphics
    Qt爲了提升針對大量簡單組件的渲染性能,創造了QGraphics這一類東西,但是他們仍然是屬於widgets模塊的,也不一定是用OpenGL渲染,如果想用OpenGL渲染,是需要在 QWidget 和 OpenGL 之間搭一個橋樑,這就是 QGLWidget

  3. QQuick
    Qt4 中的 QtQuick 1.x 更接近widget,雖然是Griphics/view,但是渲染更多是優先提交給cpu處理。
    自 Qt Quick 2.x 起統一使用OpenGL ES 2.0 或者 OpenGL 2.0來渲染界面。渲染方式更傾向於優先使用顯卡,通過硬件來加速,所以現在使用QML需要良好的顯卡支持,例如正確安裝顯卡驅動。這樣做的好處是,所有要渲染的界面元素均在最後統一提供給OpenGL,極大減少狀態切換時間和渲染時間(相比於之前使用QPainter依次爲每個界面元素渲染,不斷地重複渲染狀態)。舉例來講,就像寫文件,把要寫的內容存在緩存後統一寫入文件,一定比每次寫入都重複打開關閉文件要快。

更多內容,請查看 QML 渲染機制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章