LINUX.ORG.RU

QPropertyAnimation - создавать один или N инстансов?

 ,


1

2

Мне stackoverflow не помог (вопрос: http://stackoverflow.com/questions/18551394/many-qpropertyanimation-instances... ), придётся спросить у настоящих мужиков на ЛОРе.

Вопрос такой.

Я понимаю, что QPropertyAnimation сделан, чтобы за меня вычислять значение какой-либо проперти на момент времени тика таймера. Но мне понадобилась анимация бесконечной длины, поэтому я поставил длину анимации - 1 сек, задал бесконечное число повторений = -1, а на значение проперти забил болт и стал использовать QPropertyAnimation тупо как источник относительно равномерно происходящих тиков. В обработчике тика заглядываю в таймер QElapsedTimer и сам считаю значение всех нужных параметров для данного момента времени.

Раньше в этой роли бы QTimer, но под Linux и Windows он вёл себя по-разному: интервал 1000/30 стучал с разной частотой, приходилось ставить 1000/60 под виндой, чтобы добиться минимально нужной частоты, но тогда проц жрало сильнее. Получался некрасивый код с #ifndef-ами. QPropertyAnimation в роли тупого таймера ведёт себя гораздо лучше, хотя он долбит в районе 60fps под обоими платформами. Плюс к этому, как я понимаю, QPropertyAnimation не насилует механизм сигналов-слотов, а просто вызывает QObject::setProperty() напрямую - экономия ЦП (или я гоню?)

В общем, всё было бы хорошо, но тут понадобилось анимировать N разных виджетов. В одном чё-то там затемняется, во втором что-то движется, в третьем чё-то крутится.

«создам прокси-объект, пускай его дёргает мой бесконечный QPropertyAnimation, а этот прокси-объект пускай дёргает все N-виджетов за новый метод void animTrigger(uint64_t _currtime)» - подумал я.

Зачем я так подумал? Почему мне не нравится создание 10 независимых QPropertyAnimation? Потому что если я их запущу с интервалом в 5 ms, то каждый будет тикать независимо, отмеряя свои ~17ms (60 тиков/сек) и общая плотность таких тиков в программе будет куда больше 60 в секунду. 2 работающих асинхронных QPropertyAnimation - это уже 120.

Или я загнался и работают они гарантированно синхронно? Т.е. сколько бы я объектов QPropertyAnimation ни создавал, тикать они всё равно будут в один и тот же момент и никаких 100500 тиков в секунду я не огребу? Ответьте кто знает. Но даже если это и так, зачем я буду напрягать Qt 10...100 объектами, если мне хватает 1? Но про синхронность всё равно напишите - любопытно.

qabstractanimation.h

private:
    QBasicTimer m_timer;

qabstractanimation.cpp

void QDefaultAnimationDriver::startTimer()
{
    // always use a precise timer to drive animations
    m_timer.start(m_unified_timer->timingInterval, Qt::PreciseTimer, this);
}

...

QDefaultAnimationDriver::QDefaultAnimationDriver(QUnifiedTimer *timer)
    : QAnimationDriver(0), m_unified_timer(timer)
{
    connect(this, SIGNAL(started()), this, SLOT(startTimer()));
    connect(this, SIGNAL(stopped()), this, SLOT(stopTimer()));
}

...


void QAnimationDriver::start()
{
    Q_D(QAnimationDriver);
    if (!d->running) {
        d->running = true;
        emit started();
    }
}

Несинхронно.

Adonai ★★★
()
Ответ на: комментарий от kiverattes

Да, получается, просто таймер. От того класса все анимации наследуются.

P.S. Вроде бы в Qt 5.x механизм сигналов и слотов весьма сильно оптимизировали, но точные замеры не вёл.

Adonai ★★★
()
Ответ на: комментарий от Adonai

Покурил исходники QAbstractAnimation, нарыл там QBasicTimer - в общем я понял, мне одной такой штучки будет достаточно, чтобы анимировать весь интерфейс.

kiverattes ★☆
() автор топика
Последнее исправление: kiverattes (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.