OpenGL ES на iPhone: проблемы рисования по таймеру, нервозность - PullRequest
0 голосов
/ 03 декабря 2009

У меня есть проект 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 не идеальны и не работают с гарантированной частотой, но главная проблема здесь в том, что мой реальный цикл рисования иногда просто длится вечно, предположительно, потому что какой-то другой поток переключается на ....

1 Ответ

0 голосов
/ 08 декабря 2009

Имейте в виду, что ваше приложение может «зависать» без причины, которая не имеет ничего общего с вашим «основным циклом». Это потому, что вы многозадачны ... и, в общем, такая простая проблема, как проверка телефона по электронной почте, может вызвать проблемы такого рода. В любом случае, одна из главных причин для iPhone - когда вы перемещаетесь по разным сотовым сайтам (например, если вы в метро или в машине), иногда вы можете получить всплески, как это происходит ... независимо от того, что он делает.

Если вы используете iPhone, попробуйте режим полета и посмотрите, исчезнут ли проблемы.

- Дэвид

...