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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Kagami
  опции профиля:
сообщение 14.7.2009, 17:30
Сообщение #2


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

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

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




Репутация:   9  


Все дело в процедуре обнаружения столкновений. Это и есть узкое место. Для молекул ее можно упростить. Так как они являются идеальными шарами то столкновения между ними можно определять следующим образом: если расстояние между центрами меньше или равно сумме их радиусов, то они сталкиваются. со стенами еще проще. Смотрим расстояние от центра молекулы до стены, если оно меньше или равно ее радиусу, они сталкиваются. Так как стены перпендекулярны осям, найти это расстояние не будет очень сложно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- Petr0vi4   Оптимизация отрисовки QGraphicsEllipseItem   14.7.2009, 13:27
- - Litkevich Yuriy   Цитата(Petr0vi4 @ 14.7.2009, 17:27) Тайме...   14.7.2009, 14:00
|- - Petr0vi4   Цитата(Litkevich Yuriy @ 14.7.2009, 22:00...   14.7.2009, 14:30
- - SABROG   Цитата(Petr0vi4 @ 14.7.2009, 15:30) Цитат...   14.7.2009, 14:53
- - Petr0vi4   На 50 мс слишком медленно движутся почему-то Увел...   14.7.2009, 15:17
- - Litkevich Yuriy   Ну, что я могу сказать? Взял пример examples...   14.7.2009, 17:24
- - SABROG   Возможно есть смысл сделать кэш. Например просчита...   14.7.2009, 17:27
- - Kagami   Все дело в процедуре обнаружения столкновений. Это...   14.7.2009, 17:30
- - Litkevich Yuriy   Вообще на мой взгляд пример "сталкивающиеся м...   14.7.2009, 17:57
- - Petr0vi4   ЦитатаKagami Здесь другая сторона медали - мне при...   14.7.2009, 18:13
- - Kagami   Я не совсем это имел в виду. Тебе надо переопредел...   14.7.2009, 18:17
- - Litkevich Yuriy   Petr0vi4, щёлкай по имени автора поста, вместо цит...   14.7.2009, 19:25
- - Petr0vi4   Kagami, пришлось перелопатить все программу. Сдела...   15.7.2009, 6:26
- - Kagami   Посмотри в документации по QGraphicsItem::UserType...   15.7.2009, 17:34
|- - Petr0vi4   Что-то плохо все работает, может все-таки решить п...   16.7.2009, 15:29
- - Kagami   Может выложишь исходники программы? Если она, коне...   16.7.2009, 16:02
- - Petr0vi4   Да, конечно, вот проект.   16.7.2009, 16:28
- - Kagami   Мда.. в коде пока особо не копался, но нашел одно ...   16.7.2009, 22:07
- - Petr0vi4   Ну вообще-то это и есть правильно, но медленно.   17.7.2009, 2:18
- - Kagami   После исправлений у меня стало работать со 100 эле...   17.7.2009, 7:25
- - Litkevich Yuriy   Слушайте у меня шарик улител за пределы стены и у ...   17.7.2009, 8:20
- - Petr0vi4   Спасибо, действительно работает лучше! Я думаю...   17.7.2009, 8:31
- - Kagami   На ста шариках такие "побеги" случаются ...   17.7.2009, 11:36
- - Litkevich Yuriy   Petr0vi4, и ещё есть явный недочёт в вычислении со...   17.7.2009, 16:29
- - Petr0vi4   Litkevich Yuriy, принцип соударения заключается в ...   17.7.2009, 18:59
- - Kagami   Эх.. Видимо надо вспоминать школьную физику, а име...   17.7.2009, 20:26
- - Petr0vi4   Цитата(Kagami @ 18.7.2009, 3:26) угол пад...   18.7.2009, 2:59
|- - Kagami   Цитата(Petr0vi4 @ 18.7.2009, 3:59) При аб...   18.7.2009, 8:46
- - Litkevich Yuriy   Цитата(Kagami @ 18.7.2009, 12:46) Теперь ...   18.7.2009, 12:00


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


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




RSS Текстовая версия Сейчас: 29.4.2024, 2:48