2011-04-12 96 views
1

我不想在我的小部件(QPainter)的繪圖函數中使用Native OpenGL來提高性能。 我看到有函數QPainter :: begin/endNativePainting(),可以幫助我。 但我找不到這樣的例子... 我想知道如果這些功能是低成本,或者evry使用它們會降低性能? 2.can我可以定義beginNativePainting()和endNativePainting(),通常用於我使用的所有小部件,而不是在每個繪圖函數中都使用它。qt performance - OpenGL

TNX任何幫助....

回答

1

有一些基本的示例代碼的文檔權:http://doc.qt.io/qt-4.8/qpainter.html#beginNativePainting

本身應該是相當廉價的功能,但稱他們可能仍然會導致顯着開銷,因爲Qt必須在beginNativePainting()調用中刷新其內部繪畫隊列,並且可能必須假定調用endNativePainting()後立即更改所有內容。

對於第二部分,我不確定我是否理解你的目標。基本上,如果您有QPainter對象,則可以撥打beginNativePainting()一次。但你必須將其與endNativePainting()呼叫相匹配。所以通常的地方是paint()方法。

+0

我看到了這個例子,但是沒有使用它的程序(在qt examples/demos/nokia-forum中)...並且我想知道它是否真的有用,或者有其他方法可以這樣做。 2.如果我打算將它用於應用程序中的很多小部件,我可以將beginNativePainting()放在QWidget的ctor和第dtor端的endNativePainting()中? .....當我有很多小部件時它真的有用嗎? – dan 2011-04-12 11:31:18

+0

Qt框架提供了一個QPainter作爲QWidget的paintEvent()方法的參數。使用begin/endNativePainting()只在該方法內部有意義(只要QPainter存在)。所以你不能簡單地在ctor中調用beginNativePainting()(在什麼上?)如果你不確定你在做什麼,我建議只使用QPainter來繪製並忽略begin/endNativePainting()。只有當你遇到一些你無法用Qt API解決的問題時,那可能是需要重新考慮的問題了。 (如果你以後只是使用OpenGL,你可能想看看Qt的圖形系統。) – Steffen 2011-04-12 12:38:12

+0

我必須使用opengl來提高性能....我想知道什麼是最好的方法在不改變我的小部件代碼中的許多部件的情況下做到這一點。 – dan 2011-04-12 12:51:01

0

Qt使用一系列OpenGL功能來實現其2D繪圖,包括自定義着色器和各種幀緩衝區。它將OpenGL置於一個相當混亂的狀態。

beginNativePainting/endNativePainting是否允許Qt的繪圖引擎保存此上下文並在用戶完成繪製後檢索它。

如果讓xxxNativePainting方法做相反的事情(即自動保存並恢復OpenGL的用戶配置)本來是很不錯的,但由於Qt允許直接調用OpenGL原語,所以在沒有大量代碼的情況下保存全局狀態幾乎是不可能的並可能造成嚴重的性能下降但是,這些方法只是簡單的保存Qt的內部OpenGL狀態,而不是讓用戶代碼在一個毫無意義的配置中啓動(而且很可能隨着每個新的Qt版本而改變),將OpenGL重置爲「中立」狀態。
這意味着,一開始/結束段裏面,你會改過自新:無着色器鏈接,沒有頂點數組,最具全球性的參數復位等

相反,一個簡單的QGLWidget/PaintGL場景您可以一勞永逸地設置全局OpenGL狀態,並且只需在每幀調用渲染原語,在調用beginNativePainting(鏈接/綁定着色器,設置全局參數,選擇並啓用各種緩衝器等)。

這也意味着你應該使用原生繪畫陪練。讓每個單獨的小部件做自定義繪畫可能會很快使您的渲染癱瘓。