Russian Qt Forum
Октябрь 01, 2024, 02:33 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTimer и правильное время  (Прочитано 4464 раз)
Disa
Гость
« : Октябрь 21, 2013, 09:55 »

Из-за невнимательности, в доках пропустил, что QTimer не всегда вызывается вовремя, за что серьезно поплатился.

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

Подскажите куда капать?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Октябрь 21, 2013, 11:58 »

попробуй использовать таймер из системного API
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Октябрь 21, 2013, 12:28 »

Стоп, а зачем вобще QTimer?

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

Кроме того можно замерить реальные фпс и если они реально чаще чем 25 фпс, то такой метод (с пропусками) может сработать..

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

UPD: Хотя, кажется, FPS  - это параметр формата видео, с которым должно открываться видео устройство. Хотя я не силен в этой теме.
« Последнее редактирование: Октябрь 21, 2013, 12:35 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #3 : Октябрь 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 кадров секунду можно получить, как уже упоминалось, только на ОС реального времени.
« Последнее редактирование: Октябрь 22, 2013, 10:01 от xokc » Записан
Disa
Гость
« Ответ #4 : Октябрь 22, 2013, 11:25 »

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

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

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Октябрь 22, 2013, 12:40 »

Как-то делают видео-плееры, которые играю 2а часа видео без разбежки со временем и жестким fpsом.

Дык они используют системные AVStream mini drivers, для воспроизведения чего-либо.
(это если про винду). Т.е. это все "ядреный" интерфейс. Если не ошибаюсь.
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.081 секунд. Запросов: 23.