#iphone #frame-rate #glkit
#iPhone #частота кадров #glkit
Вопрос:
Надеюсь, что есть несколько экспертов по GLKViewController, потому что у меня есть некоторые проблемы 🙂
Просто краткое описание моего приложения. У меня есть UINavigationController, в котором я нажимаю на разные экраны.
В какой-то момент я попадаю на свой игровой экран, который является подклассом UINavigationController. На этом экране viewDidLoad
я вручную создаю EAGLContext, GLKView и создаю экземпляр нового GLKViewController (для обработки моих вызовов update amp; draw).
Я устанавливаю предпочтительный fps 30.
Проблема в том, что первые 3-4 вызова обновления приходят с правильным DT, но затем у меня есть 2-3 кадра с интервалом в 1 секунду между ними. Я измеряю DT с помощью controller.timeSinceLastUpdate
. Итак, я получаю как:
dt=0.33
dt=0.33
dt=0.33
dt=1.07
dt=1.05
dt=0.33
dt=0.33
После этого я получаю действительные значения только DT раз. Я понятия не имею, почему эти кадры имеют такую задержку. Я измерил время, которое требуется мне в методе обновления и рисования, и оно не приближается к 1 секунде.
Кроме того, я не загружаю никаких текстур и не создаю никакой геометрии. Все делается при загрузке, так как это довольно маленькая игра.
Кроме того, если я открою контроллер игрового экрана, а затем отправлю обратно другой экземпляр игрового экрана, этот новый GLKViewController будет вызывать мой метод обновления примерно каждые 1 секунду.
У кого-нибудь были проблемы с частотой кадров при использовании GLKViewController?
Спасибо,
Ответ №1:
Проблема в том, что вы не знаете, что еще делает устройство между вашими обновлениями 🙂
Возможно, вы потратили всего 0,1 секунды на работу со следующим кадром, но если есть предупреждение о памяти, то для обработки других частей вашего приложения также потребуется время. Я предполагаю, что контроллер gl сделает все возможное, чтобы придерживаться предпочтительной частоты кадров, но если в фоновом режиме происходит много событий, он мало что может с этим поделать.
Если вы убедитесь, что ваш код отображается как можно быстрее и не увеличивается так же, как частота кадров, то это не ваш путь рендеринга. Судя по вашему вопросу, похоже, вы это уже проверяли.
Другая вещь, которую вы, возможно, захотите сделать, это следить за другими уведомлениями, которые могут быть переданы в ваше приложение (например, предупреждения о памяти).
Наконец, есть ли закономерность в медленных кадрах — совпадают ли они с загрузкой нового изображения или доступом к файлу? Вы сделали как можно больше заранее? РЕДАКТИРОВАТЬ — перечитывание вашего вопроса заставляет меня думать, что вы уже это сделали, извините!
Извините, я больше не могу использовать: (
Комментарии:
1. Спасибо за ответ. Единственная фраза, которую я видел, такова, как я уже сказал. В первый раз я замечаю это большое отставание после пары (2-3) кадров при первом входе на игровой экран. Если я вернусь в главное меню и попытаюсь снова войти в игру, я получу только кадры продолжительностью около 1 секунды. Я продолжу расследование, и если я что-то найду, я опубликую это здесь.
Ответ №2:
Хорошо, итак, я наконец понял это. Оказывается, это даже не связано с GLKViewController (неожиданный сюрприз!).
Это как-то связано с тем, как я отображаю контроллер просмотра игрового экрана, например:
GameAreaViewController* gameController = [[GameAreaViewController alloc] init];
[UIView beginAnimations:@"animation" context:nil];
[self.navigationController pushViewController: gameController animated:NO];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.navigationController.view cache:NO];
[UIView setAnimationDuration:0.7f];
[UIView commitAnimations];
SAFE_DEL(gameController);
Если я использую длительность анимации 0,3f, то я не получаю никаких задержек. При 0,5f иногда я получаю это, а при 0,7 я всегда получал это.