#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 сек.
Комментариев нет:
Отправить комментарий