2015-01-09 50 views
0

我有一個簡單的繪畫應用程序,使用QGLWidget,我打電話update(rect),傳入的矩形遠小於QGLWidget的矩形。我使用一個QImage來繪製,然後在paintEvent中,我將一部分繪製到QGLWidget。當我在paintEvent方法中設置了一個斷點時,並且撥打event->rect()event->region().rects(),它將返回QGLWidget的整個矩形。我會期望它只返回傳遞給更新方法的矩形。QGLWidget更新(rect)總是繪製整個矩形

因此,繪製我的iPhone非常滯後。

這裏是我的代碼:http://pastebin.com/beyyHCPw

如果您滾動到引擎收錄的底部,你會看到我的日誌代碼我在哪裏登錄,其RECT我畫(畫矩形),以再後來該矩形回來在繪畫事件(更新rect)中。

+0

你是否檢查過你的標準化矩形的座標是否正確? –

+0

@MarcusMüller是的,我有一個qDebug在那裏,看着我的矩形座標,他們看起來很好。 – jjxtra

回答

0

我認爲如果QGLWidget使用雙緩衝,並且每次都要求您繪製一個不同的緩衝區,那麼這是預期的。

就我所知,骯髒的rects是一個通常不以這種方式使用的概念。

您的代碼的性能問題可能還在於,您每次在主內存中更改之後繪製它時,都會將1024x1536 QImage的內容上傳到圖形內存。繪製到中間Q(Open)GLFramebufferObject可能是一種改進(儘管在iPhone上可能不支持使用GL_EXT_framebuffer_blit的快速blitting)。

+0

謝謝,我會嘗試一個QGLFramebuffer對象。如何將幀緩衝區放入QGLWidget? – jjxtra

+0

如果可以(在5.4中)使用QOpenGL *類而不是QGL *,後者將被棄用。如果hasOpenGLFramebufferBlit爲true,則可以使用QOpenGLFramebufferObject :: blitFramebuffer。否則,它會變得更復雜,你必須從QOpenGLFramebufferObject :: texture獲取紋理ID,並使用包裝在QPainter :: beginNativePainting中的QOpenGLWidget上的原始GL代碼進行繪製。它可以很快得到混亂,所以確保你嘗試使用非GL QWidget或首先使用QML Canvas項目,它們應該在非極端情況下也能給你帶來好的表現。 – jturcotte

+0

將GOpenGLFramebufferObject繪製到QOpenGLWidget最簡單的方法是什麼? QOpenGLWidget沒有drawTexture方法。 – jjxtra