Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: CommunityОтветов: 1

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

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

iphonetimeropengl-espaint

Ответы

Ответ 1 · David Whatley

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

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

-- Дэйвид

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы