Страницы

Поиск по вопросам

среда, 1 января 2020 г.

Дрожание во время анимации

#cpp #qt #opengl


Рисую текстуру на GL_QUAD, запускаю анимацию движения. При движении текстуры двигается
рывками. Отрисовка идет в отдельном потоке, стоит sleep 1 мсек, время между кадрами
0 - 15 мсек.

Похоже это частая проблема при программировании 3д графики. Падение фрэймрейта на
гпу, но пока непонятно ничего.

Как этого избежить?

Проверялось на Delphi, Qt, OpenFrameworks.
    


Ответы

Ответ 1



В таких случаях обычно организуют Draw/Update цикл. Приведу пример: // в начале приложения при инициализации: lastUpdateTime = GetCurrentTime(); // ... // код регулярно вызываемого метода // (например, цикл обработки сообщений) void DoWork() { now = GetCurrentTime(); while (lastUpdateTime + updateStep <= now) { Update(); lastUpdateTime += updateStep; } Draw(); } где updateStep это время, отведённое на шаг обновления логики; обычно равно 1000 / FramePerSecond, если измерять его в миллисекундах. В методе Update() выполняем обновление состояния (в данном случае - анимации движения), а в методе Draw() производим рисование сцены. Организовать подобный метод, думаю, не составит труда.

Ответ 2



Были проблемы с таймером, частично решил. Таймер системный глючит, необходимо усреднять по времени, брать 10 кадров последних и считать среднее за это время. На половине компью.теров это помогло, на другой нет(.

Ответ 3



Если ОС - windows, то: если вы указали параметром функции sleep() некоторое число (в данном случае 1 мсек), то поток будет "спать" от 1 до <любогоколичествамсек>, как решит диспетчер потоков. Если же нужно максимально приблизиться к времени "сна" (sleep()), то можно попробывать следующее: #include ... timeBeginPeriod( 1 ); // в мсек ... //ваш код ... timeEndPeriod( 1 ); //В файл проекта подключить либу LIBS += -lwinmm

Ответ 4



Проблему можно решить умножая все расчеты на n\кол-во кадров за t сек.. Где эксперементально подобрать n и t. примерно так n= среднее кол-во кадров(на машине на которой было написано по) T = от 0.1 сек. до 1 сек.

Комментариев нет:

Отправить комментарий