Почему смартфон не ограничивает fps?
Я не могу разобраться с таким вопросом. Написал тестовую программу (по книге) для вывода графики на экран. При этом программа высчитывает время между кадрами, вычисляет их частоту в секунду (fps) и выводит в консоль. В результате я вижу, что fps варьируется от 30 до 75. В тоже время где-то читал, что смартфоны (кроме новых моделей) ограничивают fps <= 60. Я решил, что может быть это погрешности при вычислении fps. Но когда дошёл до следующей главы и начал выводить графику с помощью openGL fps стал больше 1000!!! Тут на погрешность вычисления не спишешь. Подскажите, почему так происходит? Почему такой высокий fps, если он должен быть ограничен смартфоном? Что я неправильно понял при изучении скорости вывода на экран?
Ответы (1 шт):
Поскольку не указано иное, предполагаю что весь этот код вписан в метод
onDrawFrame(GL10 gl) реализации GLSurfaceView.Renderer. Тогда он считает теоретическую производительность двух вызываемых методов и эта цифра не имеет ничего общего с реальным выводом кадров на экран.
draw();// вывод объектов на экран - комментарий здесь наглая ложь, объекты в принципе не выводятся на экран, а рендерятся в фрейм-буфер, который уже может выводиться, но опять же не здесь. Вывод на экран вызывается после завершения метода onDrawFrame() в классе GLSurfaceView, счётчик не учитывает ни это время, ни время между вызовами, а также тот факт, что вызовы большинства функций GL не блокирующие (то есть вызов вернулся в ваш код, а рендеринг ещё не завершён)
Более близким к правде будет такой подсчёт:
private long startTime = System.currentTimeMillis();
private int frameCount = 0;
public void onDrawFrame(GL10 gl) {
update();//обновление объектов
draw();// рендеринг объектов
frameCount++;
long currentTime = System.currentTimeMillis();
if ((currentTime - startTime) >= 1000) {
fps = frameCount;
frameCount = 0;
startTime = currentTime;
}
}
Здесь мы тоже бежим вперёд паровоза - считаем кадр завершённым ещё до вывода на экран, но учитываем всё время между двумя вызовами onDrawFrame, поэтому можем смело считать что получаем средний показатель количества кадров в секунду.
P.S. автору вопроса рекомендую почитать справку Как задать хороший вопрос?, чтобы мы не догадывались, не вытаскивали информацию клещами и максимально быстро получать ответы)