Во-первых, мой вопрос: как вы справляетесь с Run-Loop iOS?
Далее моя причина: я исследовал это с помощью множества прототипов (v. разработка на ранней стадии) и обнаружил ряд недоумений.
- Во-первых, проблемы ввода и цикл запуска заставляют меня попробовать следующее:
- При использовании самой рекомендуемой системы (CADisplayLink) я заметил, что некоторые сенсорные входы отбрасываются, когда загрузка процессора вызывает пересылку буфера (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. Единственный способ, которым я могу думать обо всем этом, будет включать в себя перенос рендеринга в его собственный поток, но я не уверен, что это потребовало начать повторное архивирование для многопоточности на однопроцессорном устройстве.
Так кто-нибудь нашел волшебную пулю вокруг этих проблем? Есть ли у кого-нибудь кибер-зонная архитектура, которая подбрасывает эту платформу? На данный момент похоже, что я должен выбрать меньшее из зла.