crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> тормоза QGraphicsView
Гость_Tigr_*
сообщение 11.11.2010, 9:20
Сообщение #1





Гости








    


Имеются моменты, когда рисунок сцены меняется 3-4 раза в секунду. Однако наблюдаются конкретные тормоза. Это как-нибудь можно преодолеть?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 11.11.2010, 9:29
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2931
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


а код то покажи, как ты это делаешь

про какой рисунок речь - какое-то изображение или вся сцена ?

Сообщение отредактировал Алексей1153 - 11.11.2010, 9:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Tigr_*
сообщение 11.11.2010, 9:37
Сообщение #3





Гости








    


Цитата(Алексей1153 @ 11.11.2010, 9:29) *
а код то покажи, как ты это делаешь

про какой рисунок речь - какое-то изображение или вся сцена ?

CODE


void map_panel::mouseMoveEvent(QMouseEvent *event)
{
if ((mode_mouse == MoveMap) )
{
p_map.x=p_map.x-(event->pos().x()-mousePos.x);
p_map.y=p_map.y-(event->pos().y()-mousePos.y);
mousePos.x = event->pos().x();
mousePos.y = event->pos().y();
draw_map(zoom,&p_map);//функция прорисовки
};
}


bool map_panel::draw_map(unsigned int zoom,PointCoordMap* p)
{
this->scene()->clear();
x1=this->width();
y1=this->height();
this->setSceneRect(p->x,p->y,p->x+x1,p->y+y1);
this->centerOn(p->x+x1/2,p->y+y1/2);
...
QPixmap pieceImage;
file_list.resize(mtom_n->size_f);
fp=fopen(mtom_n->FileName.toAscii(),"r+b");
fseek(fp,mtom_n->addr-1,SEEK_SET);
fread(file_list.data(),mtom_n->size_f,1,fp);
pieceImage.loadFromData(file_list);
QGraphicsPixmapItem* item = this->scene()->addPixmap(pieceImage);
item->setPos(i*256, j*256);
fclose(fp);
...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Tigr_*
сообщение 11.11.2010, 9:44
Сообщение #4





Гости








    


Заметил одну фишку: прорисовка происходит, когда мышь остановится. если бесконечно двигать, то прорисовки нет. Отсюда тормоза! Таким образом, задача свелась к тому, как заставить рисовать во время движения мыши?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 11.11.2010, 9:46
Сообщение #5


фрилансер
******

Группа: Участник
Сообщений: 2931
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


а где именно "3-4 раза в секунду" происходит ?

Ну, по крайней мере, в mouseMoveEvent так делать нельзя. Сообщений движения мыши генерируется очень много, а для глаза так часто перерисовывать нет смысла. Зато для процессора это нагрузка - вот и тормоза.

Навскидку (если, конечно, у QGraphicsView нет специальных методов - я им не пользовался, не знаю) можно сделать следующее:
1) завести флажок
bool m_bNeedRedraw;
который устанавливать по любому сообщению движения мыши в режиме MoveMap
2) по таймеру в 50...150 мс проверять состояние флажка и перерисовывать сцену, если надо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Tigr_*
сообщение 11.11.2010, 11:45
Сообщение #6





Гости








    


Тема с таймером хорошая. Однако, мне покоя не дает: почему событие mouseMoveEvent происходит только после полной остановки мыши?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 11.11.2010, 12:16
Сообщение #7


фрилансер
******

Группа: Участник
Сообщений: 2931
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


возможно, отключен трекинг. Попробуй включить
setMouseTracking()

Отстальных условий работы твоей программы знать не могу :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.5.2022, 7:16