Во-первых, мой вопрос: как вы справляетесь с Run-Loop iOS?Игры для iOS и управление Run-Loop
Следующая причина: Я изучал это с помощью множества прототипов (v. Разработка на ранней стадии) и обнаружил ряд недоумений.
- Во-первых, входные вопросы и цикл запуска приведет меня попробовать следующее:
- при использовании наиболее рекомендуемую систему (CADisplayLink) я отметил, что некоторые сенсорные входы сбрасываются после загрузки CPU вызывает буфер flip (presentRenderBuffer) придется ждать кадра. Это происходит только на устройстве, а не в симуляторе (досадно - это, похоже, связано с ожиданием блокировки vsync по основному потоку &, как прикосновение к приходу приложения, входящее в комплект поставки &),
- при использовании следующего Самая рекомендуемая система (NSTimer). Я заметил, что некоторые сенсорные входы отбрасываются, когда загрузка процессора достигает определенной точки в симуляторе, но не в устройстве (также досадно). NSTimer также приводит к гораздо более низкой точности, когда мои обновления обжигают
- при использовании наименее рекомендуемой системы (запуск цикла цикла в собственном потоке, управляемом внутренне с помощью таймера высокой точности, построенного из mach_absolute_time, все мои проблемы с сенсорным входом исчезают, однако мой код ASSERT теперь ловушки в неправильном потоке и только если я проспал после программного прерывания. (Мой код подтверждения похож на http://iphone.m20.nl/wp/?p=1) Мне очень нравится, когда моя ловушка assert code сразу же на линии, которая вызвала проблему, поэтому это решение на самом деле не выполнимый для меня. труднее отлаживать
- Во-вторых, потерянное время:
- , исследуя систему, я обнаружил, что независимо от частоты кадров (странно, но я полагаю, что статистически это все еще имеет смысл w/vsync). Я жду примерно 22% времени на vsync. Я подтвердил это, перемещаясь по glFlush/glFinish и играя с тем, как часто я выполняю вызовы presentRenderBuffer. Это ключевое время, которое я хотел бы обрабатывать AI и т. Д., А не просто останавливаться на блокирующем вызове gl. Единственный способ, которым я могу думать обо всем этом, будет включать перенос рендеринга в собственный поток, но я не уверен, что для начала повторной архивации для многопоточности на однопроцессорном устройстве.
Так кто-нибудь нашел волшебную пулю вокруг этих вопросов? Кто-нибудь имеет архитектуру run-loop для убийцы, которая является ударной игрой на этой платформе? На данный момент похоже, что я должен выбрать меньшее из зла.
Я должен отметить: когда я говорю «Входы отбрасываются», они фактически не отбрасываются, они просто отстают от любой части секунды до 10 секунд. Это не стандартное отставание, наблюдаемое на iOS и других устройствах с сенсорным экраном, но более похожее на то, что «потребление сообщений работает медленнее, чем генерация сообщений», что является суммарным (увеличивается с течением времени). – Mark
Вы делаете все в основном потоке? Вы планировали переместить любую из этой обработки в фоновый поток с использованием GCD или тому подобного? –
Вы также можете быть заинтересованы в обсуждении (как в ответах, так и комментариях) в этом вопросе: http://stackoverflow.com/questions/4739748/is-there-a-way-to-make-drawrect-work-right- теперь, когда экспериментируют несколько способов управления циклом запуска для обновлений пользовательского интерфейса. –