У меня есть проект OpenGL ES 1.1 на iPhone, в значительной степени основанный на пустом приложении OpenGL ES, приведенном здесь:
http://iphonedevelopment.blogspot.com/2009/06/empty-opengl-es-application-project.html
Тестирую на устройстве 3G (не 3GS), 8 ГБ.
Цикл рисования в моем приложении, который выполняет операции openGL, делает довольно много каждый раз, когда отображает экран. Однако в ситуациях, когда он делает одно и то же в каждом цикле рисования, я вижу переменную частоту кадров. Я установил NSTimer, который запускает код рисования 30 раз в секунду, то есть каждые 0,0333 секунды. Основная проблема заключается в том, что в то время как мой фактический код рисования часто занимает примерно такое количество времени для выполнения одной окраски (с точки зрения времени стены), оно варьируется, а иногда и занимает гораздо больше времени без видимой причины. Используя тщательное ведение журнала, чтобы сообщить о максимальных временных интервалах, когда они возникают, я могу видеть, что иногда моя отрисовка занимала до 0,23 секунды - это как 4 кадра в секунду, что по сравнению с 30 кадрами в секунду похоже на пропуск 5 кадров анимации / взаимодействия с пользователем, что не является не очень приемлемо.
Сначала я подозревал, что мой цикл рисования зацепился за какую-то блокировку (их там не так много, потому что материал рендеринга GL находится в основном потоке (что необходимо AFAIK), как и обработка входящих событий), но некоторое ведение журнала с более тонкой детализацией показал, что в одном цикле выполнения кода рисования проходит много времени для небольшого фрагмента кода, который практически ничего не делает, и уж точно не является операцией GL.
Так что это немного похоже на то, что мой поток рисования GL (то есть основной поток) иногда занимает больше времени без уважительной причины. У меня есть связь в моем приложении, и я отключил ее, чтобы проверить, не в этом ли проблема, но я все еще вижу некоторые «всплески» во времени выполнения моей картины, когда она каждый раз делает одну и ту же картину.
Похоже, что другой поток просто переключается на промежуточный код рисования целую вечность, прежде чем вернуться к моему коду рисования, в некоторых случаях.
Есть идеи, как дальше анализировать происходящее? Я знаю, что NSTimers не идеальны и не имеют гарантированной частоты, но основная проблема здесь в том, что мой фактический цикл рисования иногда длится вечно, предположительно из-за того, что какой-то другой поток переключается на ....