Russian Qt Forum

Qt => Общие вопросы => Тема начата: Disa от Октябрь 21, 2013, 09:55



Название: QTimer и правильное время
Отправлено: Disa от Октябрь 21, 2013, 09:55
Из-за невнимательности, в доках пропустил, что QTimer не всегда вызывается вовремя, за что серьезно поплатился.

Задача - обновление кадра с жестким fpsом (например 25). То есть раз в 40мс. Эти самые 40 мс не могу никак отловить. Запускаю таймер и одновременно счетчик времени. Проверил значения счетчика в момент вызова нужной функции - от 60 до 90 мс, вместо желаемых 40мс.

Подскажите куда капать?


Название: Re: QTimer и правильное время
Отправлено: kambala от Октябрь 21, 2013, 11:58
попробуй использовать таймер из системного API


Название: Re: QTimer и правильное время
Отправлено: kuzulis от Октябрь 21, 2013, 12:28
Стоп, а зачем вобще QTimer?

Можно же переопределить paintEvent() и в нем вызывать QElapsedTimer::elapsed() и если elapsed = 40 msec, то перерисовывать если нет, то пропускать перерисовку..
Или как-то так..

Кроме того можно замерить реальные фпс (http://qt-project.org/forums/viewthread/6094) и если они реально чаще чем 25 фпс, то такой метод (с пропусками) может сработать..

Но в общем случае не реально получить точность +/- 1 мсек, т.к. ОС не является реального времени. Это будет работать в некоторых специфических случаях да и то не всегда, ИМХО. :)

UPD: Хотя, кажется, FPS  - это параметр формата видео, с которым должно открываться видео устройство. Хотя я не силен в этой теме.


Название: Re: QTimer и правильное время
Отправлено: xokc от Октябрь 22, 2013, 09:56
Я делал приблизительно так (псевдокод).
Код
C++ (Qt)
 
void MyPainter::startPaint()
{
   m_nextTick = QDateTime::currentMSecsSinceEpoch() + 40;   // 40 мс между кадрами
   QTimer *timer = new QTimer();
   connect(timer, SIGNAL(timeout()), this, SLOT(checkRepaint());
   timer.start(10);  // Не 40, а 10!!!!
}
 
void MyPainter::checkRepaint()
{
   if (QDateTime::currentMSecsSinceEpoch() > m_nextTick) {
        m_nextTick += 40;
        repaintNext();
   }
}
 
Этим достигалось то, средняя частота прорисовки соответствовала именно 40 мс за счет более частого опроса таймера. Для улучшения точности можно поставить интервал таймера и в 1 мс, но реально на обычной ОС рассчитывать на точности, бОльшие, чем в 10 мс я бы не стал. Можно вместо таймера собственный поток организовать, это тоже может немного помочь.
Жестких же 25 кадров секунду можно получить, как уже упоминалось, только на ОС реального времени.


Название: Re: QTimer и правильное время
Отправлено: Disa от Октябрь 22, 2013, 11:25
Ну я думаю что 40-50мс то что нужно, наверное, потом делать дополнительную проверку каждый 3-4 секунды. Как-то делают видео-плееры, которые играю 2а часа видео без разбежки со временем и жестким fpsом. Мне в общем-то это и нужно.

Жесткий fps как раз из-за видео. Оно мб долгим до 8-10 часов (рабочая смена) и должно быть синхронизировано с аудио-потоком.
Спасибо большое всем за помощь, буду пробовать сейчас!


Название: Re: QTimer и правильное время
Отправлено: kuzulis от Октябрь 22, 2013, 12:40
Как-то делают видео-плееры, которые играю 2а часа видео без разбежки со временем и жестким fpsом.

Дык они используют системные AVStream  (http://msdn.microsoft.com/en-us/library/windows/hardware/ff554240%28v=vs.85%29.aspx)mini drivers, для воспроизведения чего-либо.
(это если про винду). Т.е. это все "ядреный" интерфейс. Если не ошибаюсь.