Неустойчивый сенсорный отклик на более низком FPS - PullRequest
0 голосов
/ 27 декабря 2011

Я делаю игру для iPhone, в которой довольно интенсивно используются пиксельные шейдеры. Из-за некоторых эффектов моя частота кадров в секунду иногда падает до ~ 22 кадров в секунду, но в большинстве случаев она составляет около 27. Когда скорость FPS там внизу, реакция на прикосновения становится крайне изменчивой. Другими словами, время обновления жеста достигает почти 5 Гц, что намного медленнее, чем в самой игре.

Кто-нибудь сталкивался с подобными проблемами? Есть ли способ обойти это?

Примечание 1: я уже использую CADisplayLink

РЕДАКТИРОВАТЬ: у меня было значительное улучшение, вручную пропуская даже кадры. Я не уверен, что это хорошая вещь, но игра оставалась вполне играбельной, и я уверен, что теперь она использует гораздо меньше процессоров.

Ответы [ 2 ]

1 голос
/ 28 декабря 2011

У меня похожая ситуация в одном из моих приложений, где у меня очень тяжелые шейдеры, которые могут привести к замедлению рендеринга на старых устройствах, но я все же хочу, чтобы частота кадров была настолько высокой, насколько это возможно на более мощном оборудовании.

Что я делаю, так это использую единую последовательную очередь GCD для всех действий, связанных с рендерингом OpenGL ES, в сочетании с семафором отправки. Я использую CADisplayLink для стрельбы со скоростью 60 FPS, затем в рамках обратного вызова я отправляю блок для фактического действия рендеринга. Я использую семафор диспетчеризации, чтобы, если CADisplayLink пытается добавить другой блок в очередь рендеринга во время его работы, этот новый блок удаляется и никогда не добавляется.

Я подробно описываю этот подход в этом ответе , и вы можете скачать исходный код моего приложения, которое использует это здесь .

Очередь GCD позволяет вам переместить этот рендеринг в фоновый поток, который оставляет ваш интерфейс отзывчивым, в то же время масштабируя FPS так, чтобы ваш рендеринг работал так быстро, как ваше оборудование поддерживает. Это имеет особые преимущества на новых двухъядерных устройствах iOS, потому что я заметил значительное увеличение скорости рендеринга, просто выполняя обновления OpenGL ES в этой фоновой очереди.

Однако, как я описываю в этом ответе, вам нужно направить все свои обновления OpenGL ES через эту очередь, чтобы избежать возможности одновременного доступа более чем одного потока к контексту OpenGL ES (что приводит к сбою).

1 голос
/ 27 декабря 2011

Если игровой цикл вашего приложения работает со скоростью 22 к / с, но запрашивает 30 к / с, это означает, что приложение переподписывает общее количество циклов ЦП, доступных в секунду в цикле выполнения пользовательского интерфейса. Либо попробуйте добавить больше материала в фоновые потоки, либо уменьшите запрошенную частоту кадров ниже, чем вы можете получить (например, установите 20 кадров в секунду), чтобы оставалось больше времени для элементов пользовательского интерфейса, таких как доставка событий касания. 1001 *

...