OpenGL ES на iPhone: проблемы с рисованием по таймеру, нервозность

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


person Community    schedule 03.12.2009    source источник
comment
Я ОП, просто чтобы уточнить: изучение журналов показывает, что в моем коде рисования нет части, которая требует времени. Различные части кода рисования занимали много времени, чтобы завершить, в разное время, поэтому иногда кажется, что мой код рисования просто «прерванный» промежуточный поток ...   -  person    schedule 03.12.2009
comment
ОП снова. Я нашел здесь информативный пост о том, почему использование NSTimer для запуска цикла рисования может быть плохой идеей (т. Е. Отзывчивость пользователя на прикосновения может не сработать): Найдите сообщение по 'igalic': idevgames.com/forum/showthread.php?t=15873   -  person    schedule 03.12.2009


Ответы (1)


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

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

-- Дэйвид

person David Whatley    schedule 08.12.2009
comment
Привет, Дэвид, спасибо за ответ. Мы действительно пробовали режим полета, и все связи отключены (у нас есть другой поток, запускающий синхронные запросы связи через NSURLConnection, но только один запрос за раз). Мы все еще время от времени получаем «всплески» (но не так сильно!). Я думаю, что стратегия отказа от использования NSTimer поможет, и я иду с этим. Это очень интересный набор слайдов о производительности iPhone OpenGL, и в нем рассматривается проблема NSTimer как таймера цикла рисования: slideshare.net/llopis/ - person ; 08.12.2009
comment
Новая функция DisplayLink была добавлена ​​специально из-за фазовой проблемы с NSTimers и обновлениями дисплея. Но это не вызовет больших всплесков (›2-кратное время одиночного кадра). - person David Whatley; 29.12.2009