VSync / реальный 30FPS на Android

8

Я работаю над игрой, которая не может работать на полной скорости на некоторых устройствах. На Tegra2 с множеством оптимизаций производительность составляет около 40 кадров в секунду. Частота кадров стабильна, но анимации недостаточно плавные, поэтому мне нужен vsync.
С 2.3 Android SDK мы можем использовать библиотеку EGL изначально. Поэтому я пытаюсь использовать eglSwapInterval, но безуспешно. В этой статье GDC кажется, что Tegra2 может это сделать.

Ps: Thread.sleep (), чтобы заставить постоянный FPS не является приемлемым решением

Эллис
источник
Я ничего не разработал для Android, поэтому не могу точно сказать, возможно ли это повлиять на интервал обмена, хотя это кажется сомнительным. Так что, если заикание анимации происходит из-за большой разницы в ее логических временных шагах, может быть, стоит попытаться вычислить средний временной шаг для пакета кадров? Как это , возможно, используя период 5-6 кадров. Это не ответ на ваш вопрос vsync, но, возможно, он поможет вашей анимации без введения фиксированного временного шага рендеринга.
достаточно
1
Так как Tegra2 - это средство немедленного рендеринга (не мозаика), я могу проверить, прошло ли время до того, как eglSwapBuffer <1 / 60s. Если нет, я жду 1 мс больше, чем 16 мс и делаю eglSwapBuffer. Это просто ужасно !!! Очень странно, что об этой функции говорят на Google IO 2011, если она не реализована.
Эллис

Ответы:

2

Согласно этому потоку в некоторых тестах opengles, драйверы большинства устройств просто игнорируют eglSwapInterval, но для tegra2 должен быть включен vsync по умолчанию (и eglSwapInterval может использоваться для его отключения).

Возможно, частота vsync на вашем устройстве такова, что ваше заикание происходит из-за ударов, иногда без учета времени кадра? Вы пробовали, если отключение vsync действительно улучшит ситуацию?

Яри ​​Комппа
источник
Я не пытался отключить vsync. Я попытался eglSwapInterval (..., 2) без успеха. Я постараюсь как можно скорее.
Эллис
Параметр swapinterval определяет минимальное количество кадров, которое должно пройти, поэтому возможно, что вы видите заикание, как 2,2,3,2,2,3,2,2,2,3 .. при условии, что все работает, что, кажется, не гарантировано =)
Яри ​​Комппа
Вот еще один маленький слепок: «интервал молча ограничивается минимальными и максимальными зависимыми от реализации значениями перед сохранением; эти значения определяются атрибутами EGLConfig EGL_MIN_SWAP_INTERVAL и EGL_MAX_SWAP_INTERVAL соответственно».
Яри ​​Комппа
eglSwapInterval (, 2) не меняет мою частоту кадров 42 кадра в секунду, и EGL_MIN_SWAP_INTERVAL равен 0 и MAX 10.
Эллис
Единственное, что я могу попробовать, это просмотреть значения от 0 до 10 и посмотреть, есть ли изменения. Если нет, функция нарушена. (Или ну, значения 0,1,9 и 10)
Яри ​​Комппа
0

Опубликовал пример 30FPS с использованием API хореографа. https://github.com/googlesamples/android-ndk/tree/master/choreographer-30fps Это работает для вас?

хак
источник
1
Хотя ваша ссылка может быть полезной (я не смотрел на нее), на этом сайте предпочтительно, чтобы ссылки суммировались в ответе на случай, если ссылка умирает, и чтобы другие знали, чего от нее ожидать. Можете ли вы включить в свой ответ полезную часть или описание образца?
Jibb Smart
И ссылка фактически мертва :)
Кару