Игры iOS и управление циклом выполнения

Во-первых, мой вопрос: как вы управляете своим циклом выполнения iOS?

Следующая моя причина: я исследовал это с помощью множества прототипов (ст.

  • при использовании наиболее рекомендуемой системы (CADisplayLink) я заметил, что некоторые сенсорные вводы сбрасываются, когда загрузка ЦП заставляет перевернуть буфер (presentRenderBuffer) для ожидания кадра. Это происходит только на устройстве, а не в симуляторе (досадно - похоже, это связано с ожиданием блокировки vsync в основном потоке и с тем, как процесс цикла выполнения приложения касается ввода и приема сообщений)
  • при использовании следующего наиболее рекомендуемая система (NSTimer). Я заметил, что некоторые сенсорные входы сбрасываются, когда загрузка ЦП достигает определенной точки в симуляторе, но не в устройстве (что тоже раздражает). NSTimer также приводит к гораздо более низкой точности при срабатывании моих обновлений
  • при использовании наименее рекомендуемой системы (выполнение цикла выполнения в собственном потоке, управляемом внутренне с помощью высокоточного таймера, созданного из mach_absolute_time, все мои проблемы с сенсорным вводом исчезнут, однако мой код ASSERT теперь перехватывает неправильный поток и только если я усну после программного прерывания. (Мой код утверждения похож на http://iphone.m20.nl/wp/?p=1 ) Мне очень нравится, когда моя ловушка кода утверждения находится сразу в строке, которая вызвала проблему, поэтому это решение для меня не работает: труднее отлаживать.
  • Во-вторых, потерянное время:
    • исследуя систему, я обнаружил, что независимо от частоты кадров (как ни странно, но я полагаю, что статистически это все еще имеет смысл с vsync) я жду примерно 22% времени на vsync. Я подтвердил это, перемещаясь вокруг glFlush / glFinish и играя с тем, как часто я выполняю вызовы presentRenderBuffer. Это ключевой момент, когда я хотел бы обрабатывать AI и т. Д., А не просто останавливаться на блокирующем вызове gl. Единственный способ, который я могу придумать для решения этой проблемы, - это перенести рендеринг в его собственный поток, но я не уверен, оправдано ли это начинать перестройку для многопоточности на однопроцессорном устройстве.
  • Так что кто-нибудь нашел волшебная пуля вокруг этих проблем? Есть ли у кого-нибудь убийственная архитектура цикла выполнения, которая? обалдеть на этой платформе? На данный момент, похоже, мне нужно выбрать меньшее из зол.

    28
    задан Mark 27 January 2011 в 15:03
    поделиться