crossplatform.ru

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

> Оптимизация отрисовки QGraphicsEllipseItem
Petr0vi4
  опции профиля:
сообщение 14.7.2009, 13:27
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 14.7.2009
Пользователь №: 907

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




Репутация:   0  


Пишу программу для симуляции движения частиц идеального газа в сосуде. У меня есть 4 стенки сосуда (QGraphicsRectItem) и 100 QGraphicsEllipsItem шариков размером 5*5 (типа молекулы).
Каждой молекуле на этапе создание присваивается вектор в виде координат 2х точек, а перемещение происходит по событию таймера вдоль этого вектора. Мне необходимо обработать столкновение между молекулами и стенами. Я все это реализовал, но дело в том, что все это жутко тормозит :(

Код обнаружения столкновений:
for(int i=0;i<Item->collidingItems().count();i++)
    {
        if(Item->collidingItems().at(i)->type() == 4) // столкновение с другой молекулой
        {
            // записываем новый вектор движения в буффер
        }
        else
        {
            if(Item->collidingItems().at(i)->type() == 3) // столкновение со стеной
            {
                // записываем новый вектор движения в буффер
            }
        }
    }

Таймер срабатывает с интервалом в 10 мс.
AllObjects - массив элементов класса Control.
Control - класс наследник QObject, в нем есть QGraphicsEllipsItem* Item (сама молекула) + переменные типа qreal для вектора движения.
Код в событии таймера:
for(int i=0;i<ObjNum;i++) // цикл по всем объектам
    AllObjects[i]->BallCollision(); //обрабатываем столкновения

// применяем координаты и двигаем шары
for(int i=0;i<ObjNum;i++)
{
    if(AllObjects[i]->Changed) // проверяем изменились ли координаты
    {
       AllObjects[i]->ReadFromBuffer(); // пишем из буфера в "рабочий" вектор
    }
    AllObjects[i]->MoveBall();//двигаем
}

Получается за 1 событие таймера я 2 раза выполняю цикл по всем объектам.
Класс для молекулы выбран с рассчетом на то, что в нем уже прописана обработка столкновений.
При количестве шариков 20-30 все работает идеально, при 50-100 уже тормозит :(
Можно ли как то ускорить обработку? Может кто-нибудь предложит какое-то альтернативное решение.
Причина редактирования: используй тэг code
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
3 страниц V  < 1 2 3  
Начать новую тему
Ответов (20 - 28)
Litkevich Yuriy
  опции профиля:
сообщение 17.7.2009, 8:20
Сообщение #21


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Слушайте у меня шарик улител за пределы стены и у окошка появились линейки прокрутки и стали быстро уменьшатся.
:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Petr0vi4
  опции профиля:
сообщение 17.7.2009, 8:31
Сообщение #22


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 14.7.2009
Пользователь №: 907

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




Репутация:   0  


Спасибо, действительно работает лучше! Я думаю на этом можно остановиться, сделал 50 частиц, выглядит вполне нормально и не тормозит как раньше. Думаю тема закрыта.

Litkevich Yuriy,
да, бывают косяки иногда, но в основном работает же.
А на счет увеличения окна: я не знаю почему так :)
какая то особенноть Qt...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 17.7.2009, 11:36
Сообщение #23


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

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




Репутация:   9  


На ста шариках такие "побеги" случаются чаще :) Это надо править механизм обнаружения столкновений. А увеличивается потому что сцена автоматически расширяется чтобы вмещать все объекты.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 17.7.2009, 16:29
Сообщение #24


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Petr0vi4, и ещё есть явный недочёт в вычислении соударений. Ситуация:
Два шарика (наблюдал максимум 4) двжутся по одной линии (траектории) ударяясь друг об друга чуть-чуть отлетают (почти без зазора) и снова летят на встречу друг-другу (хотя повода для этого нет). Другими словами, они колеблятся вокруг воображаемой линии, которой всегда касаются.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Petr0vi4
  опции профиля:
сообщение 17.7.2009, 18:59
Сообщение #25


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 14.7.2009
Пользователь №: 907

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




Репутация:   0  


Litkevich Yuriy, принцип соударения заключается в обмене векторами движения. Если 2 шара сталкнутся все работает на ура, а если 3 одновременно - тогда не знаю:) Результат крайне непредсказуем.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 17.7.2009, 20:26
Сообщение #26


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

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




Репутация:   9  


Эх.. Видимо надо вспоминать школьную физику, а именно про импульс. Если просуммировать импульсы всех столкнувшихся тел, то можно получить вполне адекватные результаты. Плюс нельзя забывать про ограничения в виде стен. Это особый случай, так как молекула не должна их пересекать. Если считать столкновение абсолютно упругим, то угол падения молекулы на стену будет равен углу отскока нее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Petr0vi4
  опции профиля:
сообщение 18.7.2009, 2:59
Сообщение #27


Студент
*

Группа: Новичок
Сообщений: 11
Регистрация: 14.7.2009
Пользователь №: 907

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




Репутация:   0  


Цитата(Kagami @ 18.7.2009, 3:26) *
угол падения молекулы на стену будет равен углу отскока нее
так и есть!
При абсолютно упругом столкновении и получается, что частицы меняются импульсами (то есть векторами движения)....Но при трех частицах как найти направления результирующих векторов? Я так и не нашел.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 18.7.2009, 8:46
Сообщение #28


Старейший участник
****

Группа: Участник
Сообщений: 601
Регистрация: 2.2.2009
Пользователь №: 523

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




Репутация:   9  


Цитата(Petr0vi4 @ 18.7.2009, 3:59) *
При абсолютно упругом столкновении и получается, что частицы меняются импульсами (то есть векторами движения)....Но при трех частицах как найти направления результирующих векторов? Я так и не нашел.

Векторами меняются при центровом ударении. В общем случае, в соответствии с третьим законом Ньютона, молекулы будут действовать друг с другом с силой, направленной вдоль оси, соединяющей их центры. При столкновении с несколькими молекулами таких сил будет несколько. Каждая из них будет давать определенный импульс молекуле. Сложив эти импульсы можно получить результирующий новый импульс тела. Это достаточно приближенно, но в целом адекватно.

P.S. Теперь пойду вспоминать как считать сумму векторов ;) Эх.. как давно была школа

Сообщение отредактировал Kagami - 18.7.2009, 8:48
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.7.2009, 12:00
Сообщение #29


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(Kagami @ 18.7.2009, 12:46) *
Теперь пойду вспоминать как считать сумму векторов
как и сложение коплексных чисел.

надо взять исходники игры бильярд
там уже всё решено.
:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 11.5.2024, 12:59