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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: 1 ... 6 7 [8]
106  Qt / 2D и 3D графика / Re: Медленный updateGL [SOLVED] : Сентябрь 09, 2012, 20:00
Хотя нет, это конечно не решает проблему. Двойная буфферизация нужна, иначе мерцать все будет.
Я выяснил почему так долго работает функция updateGL. На самом деле долго работает swapBuffers().
А работает она долго, потому что в настойках видеокарты у меня стоит принудительная вертикальная синхронизация для OpenGL. Если ее отключить, то все нормально - работает быстро. Однако как быть тем, у кого стоит принудительная вертикальная синхронизация? Эти небольшие фризы все таки заметны и режут глаз. Не говорить же каждому пользователю что бы он отключил синхронизацию) А средствами OpenGL как ее отключить не знаю. Вернее есть функция QGLFormat::setSwapInterval(), которая позволяет включить или отключить ее, однако она не работает, если включена принудительная вертикальная синхронизация...
Интересно что в игре warmux все летает, нет никаких фризов. Правда там используется SDL. Посмотрел еще alien arena, там тоже нет таких тормозов, там точно OpenGL используется.
В общем хочется найти какой то выход из положения
107  Qt / 2D и 3D графика / Re: Медленный updateGL : Сентябрь 09, 2012, 12:54
Решил проблему поменяв в конструкторе QGL::SingleBuffer
108  Qt / 2D и 3D графика / Медленный updateGL : Сентябрь 09, 2012, 12:20
Столкнулся с такой проблемой: updateGL() по времени выполняется довольно долго (8-12мс), в то время как paintGL() менее 1мс.
В paintGL я рисую не много - вообще ничего не рисую, только буфер очищаю. В своей программе я по таймеру каждые 16мс вызываю функцию updateGL(), при этом, как я уже сказал, отрисовка происходит долго (почему так? Ощущение, как будто каждый пиксель на виджете рисуется процессором через отдельную функцию.)
Если я по таймеру вызываю paintGL(), то все нормально, рендер занимает не много времени, но на виджете ничего не отображается. Если при этом вызывать updateGL(), то отобразится все что нарисовалось при вызовах paintGL().
Как сделать так, что бы обновление виджета не занимало столько времени?
Вот код:
Код:
Widget::Widget(QGLWidget *parent): QGLWidget(QGLFormat(QGL::DoubleBuffer), parent){
}


void Widget::initializeGL(){
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glHint(GL_POLYGON_SMOOTH_HINT, GL_FASTEST);
glClearColor(1, 1, 1, 1);

timer.start(16, this);
}

void Widget::timerEvent(QTimerEvent *){
time.start();
updateGL();//8-12мс
//paintGL();//<1мс
setWindowTitle(QString::number(time.elapsed()));
}

void Widget::resizeGL(int w, int h){
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, w, h, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}

void Widget::paintGL(){
glClear(GL_COLOR_BUFFER_BIT);
}
Kubuntu 12.04
Qt 4.8.1

Кстати, если вместо updateGL вызывать просто update, то время отрисовки показывает <0мс, однако по ощущениям ничего не изменилось (может быть update вызывается асинхронно?) - если перемещать окно по рабочему столу, оно двигается рывками, так же как и при updateGL. При paintGL, окно перемещается плавно
109  Qt / Общие вопросы / Re: Сила давления на экран n900 : Июнь 04, 2012, 16:09
Там не по площади соприкосновения определяется сила давления.
Мне нужен api или название эвента, отлавливающий это события.
110  Qt / Общие вопросы / Сила давления на экран n900 : Июнь 03, 2012, 12:26
Можно ли средствами Qt определить силу давлени на экран n900? Этот телефон умеет определять силу нажатия на экран, в этом можно убедиться еще в приложении Painter. Но копаться в исходниках не охота, может кто знает как это реализовать?
111  Qt / 2D и 3D графика / Re: bindTexture и созданный вручную QImage : Апрель 06, 2012, 08:10
Решил проблему.
Оказалось что вышеописанная функция выполнялась в конструкторе QGLWidget и видимо что то не успевало инициализироваться и все висло. Этого косяка не возникало когда я грузил с диска наверное потому, что пока файл грузился с диска конструктор успевал инициализировать все что ему нужно Улыбающийся
И ведь я знал что так делать нельзя и все равно попался Грустный Ну да ладно, может кто еще столкнется с этим, тогда этот пост надеюсь поможет Веселый
112  Qt / 2D и 3D графика / [решено] bindTexture и созданный вручную QImage : Апрель 05, 2012, 21:44
Создаю QImage:
Код:
QImage tex(16, 16, QImage::Format_ARGB32);
Заполняю чем-нибудь:
Код:
QPainter p;
p.begin(&tex);
p.fillRect(0, 0, 16, 16, QBrush(QColor::fromRgbF(0,0,0,0)));
p.end();
Пытаюсь создать текстуру:
Код:
bindTexture(tex);
На этом месте (bindTexture) программа виснет. Никакой ошибки, ничего в консоль не пишет, просто виснет, как будто бы попал в вечный цикл (процессор нагружен полностью).
Подскажите, в чем проблема?
Если грузить текстуру из файла, то все работает нормально. Я думаю вместе с содержимом файла подгружается его мета-информация, которая как то используется внутри bindTexture, но которую я не могу задать (да и не знаю что задавать) когда сам создаю текстуру во время работы приложения.
113  Qt / 2D и 3D графика / Re: VBO + OpenGL + Qt (как подключить VBO?) : Март 11, 2012, 17:28
Спасибо, за столь быстрый и развернутый ответ Улыбающийся Я остановился на третьем варианте, но поглядываю на второй.
114  Qt / 2D и 3D графика / [решено] VBO + OpenGL + Qt (как подключить VBO?) : Март 11, 2012, 14:41
Qt 4.7.4, не пойму как подключить VBO? Есть ли он в стандартной библиотеке Qt? Где то видел, что нужно подключать библиотеки
Код:
#include <GL/glext.h>
#include <GL/glxext.h>
но толку от них никакого. Пишу под линь и вин, использую QGLWidget
115  Qt / Общие вопросы / Подключение библиотеки собранной nvcc : Август 27, 2011, 12:06
Пытаюсь подключить библиотеку
Код:
LIBS     += a.a
Возникает куча ошибок
Код:
tmpxft_00000e76_00000000-1_1.cudafe1.cpp:(.text+0x21): undefined reference to `cudaMalloc'
tmpxft_00000e76_00000000-1_1.cudafe1.cpp:(.text+0x7b): undefined reference to `cudaConfigureCall'
tmpxft_00000e76_00000000-1_1.cudafe1.cpp:(.text+0xab): undefined reference to `cudaMemcpy'
tmpxft_00000e76_00000000-1_1.cudafe1.cpp:(.text+0xb7): undefined reference to `cudaFree'
a.a(tmpxft_00000e76_00000000-13_1.o): In function `__cudaUnregisterBinaryUtil()':
tmpxft_00000e76_00000000-1_1.cudafe1.cpp:(.text+0x11c): undefined reference to `__cudaUnregisterFatBinary'
a.a(tmpxft_00000e76_00000000-13_1.o): In function `__device_stub__Z6kernelPf(float*)':
tmpxft_00000e76_00000000-1_1.cudafe1.cpp:(.text+0x1226): undefined reference to `cudaSetupArgument'
a.a(tmpxft_00000e76_00000000-13_1.o): In function `__sti____cudaRegisterAll_36_tmpxft_00000e76_00000000_4_1_cpp1_ii_146421d2()':
tmpxft_00000e76_00000000-1_1.cudafe1.cpp:(.text+0x127a): undefined reference to `__cudaRegisterFatBinary'
tmpxft_00000e76_00000000-1_1.cudafe1.cpp:(.text+0x12db): undefined reference to `__cudaRegisterFunction'
a.a(tmpxft_00000e76_00000000-13_1.o): In function `cudaError cudaLaunch<char>(char*)':
tmpxft_00000e76_00000000-1_1.cudafe1.cpp:(.text._Z10cudaLaunchIcE9cudaErrorPT_[cudaError cudaLaunch<char>(char*)]+0x14): undefined reference to `cudaLaunch'
collect2: ld returned 1 exit status
make: *** [untitled] Ошибка 1
Процесс «/usr/bin/make» завершился с кодом 2.
Возникла ошибка при сборке проекта untitled (цель: Desktop)
Во время выполнения сборки на этапе «Сборка»

Файл 1.cu (библиотека)
Код:
#include <stdio.h>
#include "1.h"

#define N (1024*1024)
__global__ void kernel ( float * data )
{
int idx = blockIdx.x * blockDim.x + threadIdx.x;
float x = 2.0f * 3.1415926f * (float) idx / (float) N;
data [idx] = sinf ( sqrtf ( x ) );
}

int foo ()
{
float a [N];
float * dev = NULL;
cudaMalloc ( (void**)&dev, N * sizeof ( float ) );
kernel<<<dim3((N/512),1), dim3(512,1)>>> ( dev );
cudaMemcpy ( a, dev, N * sizeof ( float ), cudaMemcpyDeviceToHost );
cudaFree( dev );
for (int idx = 0; idx < N; idx++)
printf("a[%d] = %.5f\n", idx, a[idx]);
return 0;
}

хэдер файл 1.h
Код:
int foo ();

библиотеку делаю командой
Код:
nvcc 1.cu -lib

Я так понимаю в эту библиотеку не включаются все вспомогательные компоненты (другие библиотеки), можно ли их как нибудь автоматически включить? Или нужно вылавливать каждую и руками добавлять к моей конечной библиотеке? И если руками, то как? (покажите пример добавление одной такой библиотеки и как ее найти)
Понимаю вопрос не совсем по Qt, но русских форумов по CUDA не нашел.
116  Qt / 2D и 3D графика / Re: Вывести массив пикселей на экран : Апрель 09, 2011, 12:34
Блииин Смеющийся А слона то я и не приметил. Есть же еще QImage)
Спасибо большое!
117  Qt / 2D и 3D графика / Вывести массив пикселей на экран : Апрель 08, 2011, 20:50
Здравствуйте) Возник вопрос, с которым самостоятельно никак не могу разобраться.
Имеется указатель на массив типа int:
Код:
int *a = new[this->width()*this->height()];
В нем я собираюсь хранить цвета пикселей. То есть a[23][468] - это цвет пикселя с позицией (23, 468).
Как бы мне его вывести на экран? Да чтоб разом и быстро и красиво)
Когда то давно я писал на билдере, там можно создать битмап а потом получить указатель на строчку пикселей в нем. Функция называлась scanline. Можно было работать с ним как с простым массивом, а потом в одну функцию отобразить на экране. Получалось как раз быстро, коротко и красиво.
Что я уже перепробовал в Qt:
Код:
void MainWindow::paintEvent(QPaintEvent *){
QPainter p;
p.begin(this);
p.setPen(QPen(QColor(rand()%16777000)));
//------------------------------------------------------------------------------------------------------- 1
for (int i=0; i<this->width(); i++)
for (int j=0; j<this->height(); j++){
p.drawPoint(i,j); // 360-430 ms
}
//------------------------------------------------------------------------------------------------------- 2
QPoint *points = new QPoint[this->width()*this->height()];
for (int i=0; i<this->width(); i++)
for (int j=0; j<this->height(); j++){
points[j*this->width()+i].setX(i);
points[j*this->width()+i].setY(j);
}
p.drawPoints(points, this->width()*this->height()); // 18-29 ms
//------------------------------------------------------------------------------------------------------- 3
QPixmap pxm(this->width(), this->height());
p.drawPixmap(0, 0, pxm); // <1 ms

p.end();
}
Кому лень разбираться в чужом коде, объясню:
В первом случае я заполняю экран по одному пикселю (drawPoint). Самый тупой метод, его я отбросил сразу, но до кучи решил добавить. Время заполнения экрана 1600х900 примерно  360-430 мс. Ужас.
Во втором случае я создаю указатель на массив точек, и вывожу на экран все эти точки разом (drawPoints). Результат конечно получше стал, но для интерактивной графики все равно не подходит. 18-29 мс.
Третий метод, на который я возлагал большие надежды - отрисовка пиксмапа (drawPixmap). Я так понял это один из самых примитивных классов для хранения растровой графики в Qt? Что то типа битмапа на билдере. В общем таймер показал 0 мс.

Но самое главное - как заполнить этот пихмап своими значениями? Можно как то получить от него указатель на массив пикселей? Как это вообще можно сделать в Qt? Хочется свободно изменять значения, а потом отображать их.

Кстати, это все для z-буфера)
118  Qt / 2D и 3D графика / Re: Требуется критика по работе с OpenGL : Октябрь 22, 2010, 19:38
Хорошо сделано, но при анимации отражение слайдов отстает от самих слайдов. И еще у меня кажется рендер осуществляется програмно - все тормозит. Qt 4.7
Хм, а на линуксе все летатет) и из за того что летает незаметно что отражение отстает.
Страниц: 1 ... 6 7 [8]

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