Каждой молекуле на этапе создание присваивается вектор в виде координат 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 уже тормозит
Можно ли как то ускорить обработку? Может кто-нибудь предложит какое-то альтернативное решение.