Russian Qt Forum
Ноябрь 24, 2024, 04:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QGraphicsView + QGLWidget = добиться быстродействия и качества картинки  (Прочитано 4927 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Август 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.
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #1 : Август 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;
}
Записан
vintik
Гость
« Ответ #2 : Август 23, 2011, 22:57 »

вообще бы неплохо сюда кинуть полный текст ошибки из консоли)

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

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

Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #3 : Август 23, 2011, 23:12 »

да, но при попытке удаления glwidget после setViewport(0), в проге тоже SIGSEGV
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #4 : Август 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
Записан
vintik
Гость
« Ответ #5 : Август 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 ничего не нужно.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.126 секунд. Запросов: 23.