SORU
13 Temmuz 2012, Cuma


-Ekran kapalı QPainterPaths oluşturma etkin olan ve olmayan OpenGL OpenGL çözüm gerekli)

  1. Benim uygulamada, sokak harita widget QPainterkullanarak boya
    • QPainterPaths tarafından yapılan önceden çizilmiş yolları içeriyor
    • widget şu anda QGLWidget ama bu değişebilir ** 7, Bir bir.
  2. Resim ekranın dışına taşımak için çalışıyorum ve yığın halinde işleri bölmek
    • QImage üzerine her parça boya ve son olarak widget üzerine tüm resimler çizmek istiyorum
    • QPainterPaths zaten sorun bu değil yani yığın halinde
    • sorun QImages çizim hakkında5 kez daha yavaşdaha QWidget üzerinde çizim
  3. Bazı değerlendirme testi ben yaptım
    • zaman değerleri birden çok çalıştırır yuvarlak ortalamalar
    • test kısmını yaklaşık 150 doğrusal çizgi parçaları her biri 100 QPainterPaths içerir
    • yaklaşık 15k yolları QPainter::Antialiasing render ipucu ile çizilir, QPen yuvarlak uç kullanır ve yuvarlak katıl
  4. Benim kaynak QPainterPaths (renk ve genişliği; bazı çizgi . unutmayın ^strong>çizilmişbazıdolu)
    • QPainter destekler çizim tüm diğer türleri ihtiyacım yok
    • QPainterPaths ** 20, bu iyi bir çözüm olurdu bir çizilmiş olabilir başka bir şey dönüştürülebilir.
    • Köşe verileri için ekran kapalı ve çoğu 2D için değil OpenGL tamponlar, farklı türleri olduğunu biliyorum ama işleme görüntü işleme OpenGL aşina değilim.
Paint Device for chunk | Rendering the chunk itself | Painting chunk on QWidget
----------------------- ---------------------------- --------------------------
QImage                 |                    2000 ms |                   < 10 ms
QPixmap (*)            |                     250 ms |                   < 10 ms
QGLFramebufferObj. (*) |                      50 ms |                   < 10 ms
QPicture               |                      50 ms |                    400 ms
----------------------- ---------------------------- --------------------------
none (directly on a QWidget in paintEvent)          |                    400 ms
---------------------------------------------------- --------------------------

(*) These 2 lines have been added afterwards and are solutions to the problem!

Eğer bana bir anlatsan iyi olurdunon-OpenGL tabanlı bir çözümiki versiyonu benim uygulama derlemek istiyorum olarak da: OpenGL non-OpenGL sürüm.
Ayrıca, çözümün bir işlemek için mümkün olmak istiyorumnon-GUI iplik.


İyi bir şekilde verimli bir şekilde parçalar ekran dışı beraberlik var mı?
Off-ekran sayacı QPainter için boya bir cihaz olarak kullanılabilir QGLWidget (OpenGL off-screen buffer) bölümü var mı?

CEVAP
8 EKİM 2012, PAZARTESİ


Qt-interest Archive, August 2008 QGLContext::create() belge

diyor ki:

Bir QGLContext geçerli GL boya cihazı ile oluşturulabilir ya bir QGLWidget, QGLPixelBuffer bağlı olması gerekiyor ya da anlamına gelir Oluşturduğunuzda QPixmap. Eğer verecek bir QPixmap kullanırsanız sadece yazılım oluşturma ve bunu istemezsin.Bir QGLFramebufferObject sadece oluşturulabilir kendisi geçerli GL boya bir cihaz, yer değil bir QGLWidget veya QGLPixelBuffer kapsamında. Bunun anlamı nedir sanagerekbir QGLWidget ya da sizin için üs olarak QGLPixelBuffer QGLFramebufferObject.

Belgede belirtildiği gibi, Eğer off-screen buffer opengl kullanarak işlemek istiyorsanız, QGLPixelBuffer gerekir. Aşağıdaki kod OpenGL ile QGLPixelBuffer nasıl kullanılacağını gösteren çok basit bir örnek:

#include <QtGui/QApplication>
#include <Windows.h>
#include <gl/GL.h>
#include <gl/GLU.h>
#include <QtOpenGL/QGLFormat>
#include <QtOpenGL/QGLPixelBuffer>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    // Construct an OpenGL pixel buffer.
    QGLPixelBuffer glPixBuf(100, 100); 
    // Make the QGLContext object bound to pixel buffer the current context
    glPixBuf.makeCurrent();
    // The opengl commands 
    glClearColor(1.0, 1.0, 1.0, 0.0);
    glViewport(0, 0, 100, 100);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, 100, 0, 100);
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0.0, 0.0);
    glPointSize(4.0);
    glBegin(GL_TRIANGLES);
    glVertex2i(10, 10);
    glVertex2i(50, 50);
    glVertex2i(25, 75);
    glEnd();
    // At last, the pixel buffer was saved as an image
    QImage &pImage = glPixBuf.toImage();
    pImage.save(QString::fromLocal8Bit("gl.png"));

    return a.exec();
}

Program sonucu bir png resim dosyası olarak:

enter image description here

Olmayan opengl sürüm QPixmap kullanarak, belki de aşağıda biçimleri: kodu

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QPixmap pixmap(100, 100);
    QPainter painter;
    painter.begin(&pixmap);
    painter.drawText(10, 45, QString::fromLocal8Bit("I love American."));
    painter.end();
    pixmap.save(QString::fromLocal8Bit("pixmap.png"));

    return a.exec();
}

Program sonucu yukarıdaki gibi bir png dosyası

enter image description here

Kod basit ama işe yarıyor olsa, belki bazı değişiklikler bunu uygun hale getirmek için ne yapabilirim.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • MatheusDosGames

    MatheusDosGa

    28 Aralık 2011
  • SegaAmerica

    SegaAmerica

    5 Mart 2008
  • SuicideSheeep

    SuicideSheee

    8 Ocak 2012