crossplatform.ru

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

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
> Оптимизация отрисовки QGraphicsEllipseItem
Kagami
  опции профиля:
сообщение 14.7.2009, 18:17
Сообщение #11


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

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

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




Репутация:   9  


Я не совсем это имел в виду. Тебе надо переопределить функцию, рассчитывающую столкновения. Она будет сама вызываться при необходимости. В последнем обновлении документации пример Colliding Mice был переведен на русский. Посмотри его внимательней (заодно ошибки поищешь ;))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.7.2009, 19:25
Сообщение #12


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

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

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




Репутация:   94  


Petr0vi4, щёлкай по имени автора поста, вместо цитаты. Его имя сразу добавится в форму быстрого ответа.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Petr0vi4
  опции профиля:
сообщение 15.7.2009, 6:26
Сообщение #13


Студент
*

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

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




Репутация:   0  


Kagami, пришлось перелопатить все программу. Сделал теперь класс Control наследником QGraphicsEllipseItem, наследство от QObject убрал за ненадобностью (сначала хотел использовать сигналы/слоты, но потом отпало). Переписал функцию collidesWithItem() для молекул, работает, но как теперь отличить молекулу от стены?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 15.7.2009, 17:34
Сообщение #14


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

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

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




Репутация:   9  


Посмотри в документации по QGraphicsItem::UserType и QGraphicsItem::type(). При определении столкновения смотришь какого типа исследуемый объект. Если это молекула или стена, то ты уже знаешь что с ними делать. В противном случае можно вызывать метод родителя.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Petr0vi4
  опции профиля:
сообщение 16.7.2009, 15:29
Сообщение #15


Студент
*

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

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




Репутация:   0  


Что-то плохо все работает, может все-таки решить проблему как-то по-другому? Вроде программа простая.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 16.7.2009, 16:02
Сообщение #16


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

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

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




Репутация:   9  


Может выложишь исходники программы? Если она, конечно, не секретная ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Petr0vi4
  опции профиля:
сообщение 16.7.2009, 16:28
Сообщение #17


Студент
*

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

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




Репутация:   0  


Да, конечно, вот проект.
Прикрепленные файлы
Прикрепленный файл  PhysX.zip ( 11.45 килобайт ) Кол-во скачиваний: 116
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 16.7.2009, 22:07
Сообщение #18


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

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

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




Репутация:   9  


Мда.. в коде пока особо не копался, но нашел одно узкое место, устранение которого резко повысило скорость. Проблема была в функции Control::BallCollision(). Ты постоянно вызывал функцию collidingItems(), что приводило к постоянному созданию и удалению списка элементов. Правильнее было бы так:
Раскрывающийся текст
void Control::BallCollision() // столкновение
{
    QList<QGraphicsItem *> list = collidingItems();
    for(int i=0;i<list.count();i++)
    {
        if(list.at(i)->type() == 4)// с шаром
        {
            int Num = list.at(i)->data(1).toInt();
            SetVectorToBuffer(pos().x(),pos().y(),AllObjects[Num]->dx,AllObjects[Num]->dy);
            Changed = true;
        }
        else
        {
            if(list.at(i)->type() == 3)// со стеной
            {
                int Num = list.at(i)->data(1).toInt();
                if(Num==0)
                {
                    qreal Y_k = pos().y();
                    qreal X_k = pos().x();
                    SetVector(X_k,Y_k,X_k+dx,Y_k-dy);
                }
                //if(Num==1)
                else
                {
                    qreal X_k = pos().x();
                    qreal Y_k = pos().y();
                    SetVector(X_k,Y_k,X_k-dx,Y_k+dy);
                }
            }
        }
    }
}

Я вызываю эту функцию один раз и сохраняю полученный список в локальной переменной. Впрочем, к работоспособности кода это имеет мало отношения ;) Может у тебя сохранился вариант когда все работало правильно, но медленно?

P.S. Теперь узким местом стала фунция Module(). Поэтому в Control::MoveBall() я заменил ее на qAbs().

Сообщение отредактировал Kagami - 16.7.2009, 22:24
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Petr0vi4
  опции профиля:
сообщение 17.7.2009, 2:18
Сообщение #19


Студент
*

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

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




Репутация:   0  


Ну вообще-то это и есть правильно, но медленно. :blush:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Kagami
  опции профиля:
сообщение 17.7.2009, 7:25
Сообщение #20


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

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

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




Репутация:   9  


После исправлений у меня стало работать со 100 элементами довольно шустро
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 26.12.2025, 8:39