Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Fregloin от Август 23, 2011, 21:23



Название: QGraphicsView + QGLWidget = добиться быстродействия и качества картинки
Отправлено: Fregloin от Август 23, 2011, 21:23
Подозреваю что среди форумчан я далеко не первый, кто решил использовать связку из QGraphicsView и QGLWidget.
Первое, что заметил, что при программной отрисовке без использования GL рисуется сцена намного качественнее и быстрее.
Изначально делал, setViewport(QGLWidget()), затем что бы добиться сглаживания, делал так setViewport(QGLWidget(QGLFormat(QGL::SampleBuffers))).
На моем Radeon HD 4850 сглаживание появилось, а вот скорости не прибавилось.

Код:
if(!fGlWidget)
            {
                //fGlWidget = new QGLWidget(fGLFormat); //после этого вылетает SIGSEGV с кучей ошибок в консоли
                fGlWidget = new QGLWidget(QGLFormat(QGL::SampleBuffers));
            }
            setViewport(fGlWidget);

Еще, хочу использовать GLFormat в коде, изменять флаги, конфигурировать отображение GL, но при попытке установки формата для GLWidget, програма вылетает в SIGSEGV, с руганью на неправильные данные переданные C функции и рекурсией прорисовки .. хз, что это. Кто то сталкивался с подобным?

Так как прога будет работать под разными осями и на разных карточках, хочу добавить возможность более тонкой настройки рендеринга GL.


Название: Re: QGraphicsView + QGLWidget = добиться быстродействия и качества картинки
Отправлено: Fregloin от Август 23, 2011, 21:25
и еще, вопрос, корректно ли я переключаю режим рендеринга таким образом?
Код:
if(frenderer!=ARenderer)
    {
        setUpdatesEnabled(false);
        if(frenderer == rdOpenGL)
        {
            if(fGlWidget)
            {
                setViewport(0);
                fGlWidget = NULL;
                setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
            }
        }
        else
        {
            if(!fGlWidget)
            {
                //fGlWidget = new QGLWidget(*fGLFormat);
                fGlWidget = new QGLWidget(QGLFormat(QGL::SampleBuffers));
            }
            setViewport(fGlWidget);
            //setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
        }
        frenderer = ARenderer;
        setUpdatesEnabled(true);
    }
Потому что после того, как установил QGLWidget, при завершении программы в консоль выдает, что не все ресурсы освобождены

в деструкторе view
Код:
QExGraphicsView::~QExGraphicsView()
{
    if(fGlWidget) delete fGlWidget;
}


Название: Re: QGraphicsView + QGLWidget = добиться быстродействия и качества картинки
Отправлено: vintik от Август 23, 2011, 22:57
вообще бы неплохо сюда кинуть полный текст ошибки из консоли)

На первый взгляд вот тут место подозрительное
if(fGlWidget)
{
   setViewport(0);
   fGlWidget = NULL;
   setViewportUpdateMode(QGraphicsView::SmartViewportUpdate);
}

Указатель fGlWidget обнуляется, а ресурс на который он указывал - не освобождается...
А потом можем попасть в это условие, где память снова выделяется
if(!fGlWidget)
{
   fGlWidget = new QGLWidget(QGLFormat(QGL::SampleBuffers));
}



Название: Re: QGraphicsView + QGLWidget = добиться быстродействия и качества картинки
Отправлено: Fregloin от Август 23, 2011, 23:12
да, но при попытке удаления glwidget после setViewport(0), в проге тоже SIGSEGV


Название: Re: QGraphicsView + QGLWidget = добиться быстродействия и качества картинки
Отправлено: Fregloin от Август 24, 2011, 15:00
привожу вывод ошибки

Код:
QGLShader::link: "Vertex shader(s) linked, fragment shader(s) linked.
"
QGLShader::link: "Vertex shader(s) linked, fragment shader(s) linked.
"
QGLShader::link: "Vertex shader(s) linked, fragment shader(s) linked.
"
QGLShader::link: "Vertex shader(s) linked, fragment shader(s) linked.
"
QGLShader::link: "Vertex shader(s) linked, fragment shader(s) linked.
"
QGLShader::link: "Vertex shader(s) linked, fragment shader(s) linked.
"
QGLShader::link: "Vertex shader(s) linked, fragment shader(s) linked.
"
QGLShader::link: "Vertex shader(s) linked, fragment shader(s) linked.
"
QGLShader::link: "Vertex shader(s) linked, fragment shader(s) linked.
"
QObject::connect: Cannot queue arguments of type 'TReadMode'
(Make sure 'TReadMode' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'TReadMode'
(Make sure 'TReadMode' is registered using qRegisterMetaType().)
QGLShader::link: "Vertex shader(s) linked, fragment shader(s) linked.
"
QGLShader::link: "Vertex shader(s) linked, fragment shader(s) linked.
"
QGLShader::link: "Vertex shader(s) linked, fragment shader(s) linked.
"
QGLShader::link: "Vertex shader(s) linked, fragment shader(s) linked.
"
QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

QGLContext::makeCurrent() : GetDC() failed: ???????????? ?????????? ????.

ASSERT: "d" in file ..\..\include/QtCore/../../src/corelib/tools/qscopedpointer.h, line 112
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
QWidget::repaint: Recursive repaint detected
ASSERT: "d" in file ..\..\include/QtCore/../../src/corelib/tools/qscopedpointer.h, line 112
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
Error - RtlWerpReportException failed with status code :-1073741823. Will try to launch the process directly
RtlWerpReportException failed with status code :-1073741823. Will try to launch the process directly

Error - Failed to create the process C:\Windows\system32\WerFault.exe
Failed to create the process C:\Windows\system32\WerFault.exe

Error - StartCrashVertial failed
StartCrashVertial failed


Название: Re: QGraphicsView + QGLWidget = добиться быстродействия и качества картинки
Отправлено: vintik от Август 25, 2011, 01:35
Ассистант вот чё говорит:
void QAbstractScrollArea::setViewport ( QWidget * widget )
Sets the viewport to be the given widget. The QAbstractScrollArea will take ownership of the given widget.

провёл эксперимент, да, действительно вид берёт на себя удаление старого вьюпорта перед установкой нового методом setViewport().
Соответственно, удалять вручную оператором delete ничего не нужно.