У меня есть проект 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 секунды - это похоже на 4FPS, что по сравнению с 30FPS похоже на пропуск 5 кадров анимации / взаимодействия с пользователем, что не не очень приемлемо.
Сначала я подозревал, что мой цикл рисования зацепился за какую-то блокировку (там их не так много, потому что GL визуализирует вещи в основном потоке (что необходимо для AFAIK), как при обработке входящих событий), но некоторые записи с более высокой степенью детализации выяснилось, что в одном цикле выполнения кода рисования большое количество времени затрачивается на часть кода, который практически ничего не делал, и определенно не является операцией GL.
Так что это похоже на мой поток прорисовки GL (то есть основной поток), иногда занимает больше времени без веской причины. У меня есть приложение в моем приложении, и я отключил его, чтобы увидеть, не в этом ли проблема, но я все еще вижу некоторые «всплески» во время выполнения моей картины, когда каждый раз выполняется одна и та же картина.
Похоже, что другой поток просто переключается на код средней краски целую вечность, прежде чем снова вернуться к моему коду рисования.
Есть идеи, как дальше анализировать, что происходит? Я знаю, что NSTimers не идеальны и не работают с гарантированной частотой, но главная проблема здесь в том, что мой реальный цикл рисования иногда просто длится вечно, предположительно, потому что какой-то другой поток переключается на ....