Подтвердить что ты не робот

UIView animateWithDuration: замедляет частоту кадров анимации

Я использую CADisplayLink для рисования кадров с использованием метода EAGLView в игре со скоростью 60 раз в секунду.

Когда я звоню UIView animateWithDuration:, частота кадров падает до половины, от 60 до 30 кадров в секунду на время анимации. Как только анимация закончена, fps мгновенно поднимается до 60.

Я также попытался использовать NSTimer метод анимации вместо CADisplayLink и все равно получить тот же результат.

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

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

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

Кто-нибудь видел эту проблему или решил ее раньше?

4b9b3361

Ответ 1

Решение этого - сделать свою собственную анимацию и blit во время обратного вызова CADisplayLink.

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

2) Когда у вас есть анимация, которую вы хотите сделать, хорошо, создайте серию изображений в коде (либо тогда, либо перед рукой), и каждый так много обратных вызовов в displayLink блиит изображение на экране.

Ответ 2

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

Ответ 3

Используйте OpenGL или CoreAnimation. Они несовместимы.

Чтобы проверить это, удалите любую анимацию UIView, частота кадров будет такой, какой вы ожидаете. Добавьте обратно анимацию UIView, она упадет до 30 кадров в секунду.

Ты сказал:

Когда я вызываю UIView animateWithDuration: частота кадров падает до половины, от 60 до 30 кадров в секунду во время анимации. Как только анимация закончена, fps мгновенно поднимается до 60

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