Qt使用一系列OpenGL功能來實現其2D繪圖,包括自定義着色器和各種幀緩衝區。它將OpenGL置於一個相當混亂的狀態。
beginNativePainting
/endNativePainting
是否允許Qt的繪圖引擎保存此上下文並在用戶完成繪製後檢索它。
如果讓xxxNativePainting
方法做相反的事情(即自動保存並恢復OpenGL的用戶配置)本來是很不錯的,但由於Qt允許直接調用OpenGL原語,所以在沒有大量代碼的情況下保存全局狀態幾乎是不可能的並可能造成嚴重的性能下降但是,這些方法只是簡單的保存Qt的內部OpenGL狀態,而不是讓用戶代碼在一個毫無意義的配置中啓動(而且很可能隨着每個新的Qt版本而改變),將OpenGL重置爲「中立」狀態。
這意味着,一開始/結束段裏面,你會改過自新:無着色器鏈接,沒有頂點數組,最具全球性的參數復位等
相反,一個簡單的QGLWidget
/PaintGL
場景您可以一勞永逸地設置全局OpenGL狀態,並且只需在每幀調用渲染原語,在調用beginNativePainting
(鏈接/綁定着色器,設置全局參數,選擇並啓用各種緩衝器等)。
這也意味着你應該使用原生繪畫陪練。讓每個單獨的小部件做自定義繪畫可能會很快使您的渲染癱瘓。
我看到了這個例子,但是沒有使用它的程序(在qt examples/demos/nokia-forum中)...並且我想知道它是否真的有用,或者有其他方法可以這樣做。 2.如果我打算將它用於應用程序中的很多小部件,我可以將beginNativePainting()放在QWidget的ctor和第dtor端的endNativePainting()中? .....當我有很多小部件時它真的有用嗎? – dan 2011-04-12 11:31:18
Qt框架提供了一個QPainter作爲QWidget的paintEvent()方法的參數。使用begin/endNativePainting()只在該方法內部有意義(只要QPainter存在)。所以你不能簡單地在ctor中調用beginNativePainting()(在什麼上?)如果你不確定你在做什麼,我建議只使用QPainter來繪製並忽略begin/endNativePainting()。只有當你遇到一些你無法用Qt API解決的問題時,那可能是需要重新考慮的問題了。 (如果你以後只是使用OpenGL,你可能想看看Qt的圖形系統。) – Steffen 2011-04-12 12:38:12
我必須使用opengl來提高性能....我想知道什麼是最好的方法在不改變我的小部件代碼中的許多部件的情況下做到這一點。 – dan 2011-04-12 12:51:01