Оптимизация отрисовки QGraphicsEllipseItem |
Здравствуйте, гость ( Вход | Регистрация )
Оптимизация отрисовки QGraphicsEllipseItem |
Petr0vi4 |
14.7.2009, 13:27
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 11 Регистрация: 14.7.2009 Пользователь №: 907 Спасибо сказали: 0 раз(а) Репутация: 0 |
Пишу программу для симуляции движения частиц идеального газа в сосуде. У меня есть 4 стенки сосуда (QGraphicsRectItem) и 100 QGraphicsEllipsItem шариков размером 5*5 (типа молекулы).
Каждой молекуле на этапе создание присваивается вектор в виде координат 2х точек, а перемещение происходит по событию таймера вдоль этого вектора. Мне необходимо обработать столкновение между молекулами и стенами. Я все это реализовал, но дело в том, что все это жутко тормозит Код обнаружения столкновений:
Таймер срабатывает с интервалом в 10 мс. AllObjects - массив элементов класса Control. Control - класс наследник QObject, в нем есть QGraphicsEllipsItem* Item (сама молекула) + переменные типа qreal для вектора движения. Код в событии таймера:
Получается за 1 событие таймера я 2 раза выполняю цикл по всем объектам. Класс для молекулы выбран с рассчетом на то, что в нем уже прописана обработка столкновений. При количестве шариков 20-30 все работает идеально, при 50-100 уже тормозит Можно ли как то ускорить обработку? Может кто-нибудь предложит какое-то альтернативное решение.
Причина редактирования: используй тэг code
|
|
|
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, 8:46
Сообщение
#28
|
Старейший участник Группа: Участник Сообщений: 601 Регистрация: 2.2.2009 Пользователь №: 523 Спасибо сказали: 101 раз(а) Репутация: 9 |
При абсолютно упругом столкновении и получается, что частицы меняются импульсами (то есть векторами движения)....Но при трех частицах как найти направления результирующих векторов? Я так и не нашел. Векторами меняются при центровом ударении. В общем случае, в соответствии с третьим законом Ньютона, молекулы будут действовать друг с другом с силой, направленной вдоль оси, соединяющей их центры. При столкновении с несколькими молекулами таких сил будет несколько. Каждая из них будет давать определенный импульс молекуле. Сложив эти импульсы можно получить результирующий новый импульс тела. Это достаточно приближенно, но в целом адекватно. P.S. Теперь пойду вспоминать как считать сумму векторов Эх.. как давно была школа Сообщение отредактировал Kagami - 18.7.2009, 8:48 |
|
|
Litkevich Yuriy |
18.7.2009, 12:00
Сообщение
#29
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Теперь пойду вспоминать как считать сумму векторов как и сложение коплексных чисел.надо взять исходники игры бильярд там уже всё решено. |
|
|
Текстовая версия | Сейчас: 11.5.2024, 12:59 |