Ответ 1
NSTimer
не является таймером реального времени. Он даже не закрывается, и это не значит быть. Если вы смотрите на что-либо быстрее, чем на полсекунды, NSTimer
- неправильный инструмент. Я бы даже не рекомендовал его для вещей в течение секунды. Для многосекундных вещей, и особенно многоминутных вещей, когда вам не очень-то важно, когда он стреляет, это здорово. Я использую его все время.
CACurrentMediaTime()
не является таймером. Это обертка вокруг наиболее точной функции времени в системе: mach_absolute_time()
. Поэтому, если вы действительно волнуете, в какое время это сейчас, и вы хотите, чтобы это было понятным человеком, CACurrentMediaTime()
- это ваша функция. mach_absolute_time()
даст вам действительно точное число, но оно основано на абсолютном блоке абсолютного времени Маха, который на самом деле не указывает на то, что надоедливые люди думают (и каждый процессор имеет разный масштаб). Вот почему мы CACurrentMediaTime()
облегчили нашу жизнь.
ОК, поэтому NSTimer
не используется в режиме реального времени, а CACurrentMediaTime()
не является таймером. Что программист игры?
Grand Central Dispatch включает в себя одну из лучших систем "сделай эту работу примерно в это время" у нас. Это источник отправки. Я говорю "об этом времени", потому что GCD по-прежнему не является "реальным временем" в том смысле, что ребята из RTOS это понимают. Но в реальном времени достаточно для разработчиков игр. Найдите "Создание таймера" в Concurrency Руководстве по программированию. Также взгляните на dispatch_after()
, что хорошо для однократного запуска "запустите это после задержки".
Помните, что все, что работает в вашем основном потоке (поток пользовательского интерфейса, где выполняется весь чертеж), собирается делиться временем со всем остальным в этом потоке. Так часто вам придется делать вычисления в фоновом потоке, пока вы обрабатываете рисование и взаимодействие с пользователем в основном потоке. Это та вещь, с которой GCD dispatch_queues разработаны, чтобы помочь вам. С другой стороны, помните, что многие устройства iOS являются одноядерными. Таким образом, "фоновый поток" является немного неправильным. За один раз на CPU может работать только одна вещь. Вот почему перемещение вещей на GPU настолько важно (см. Ниже).
Вы также можете серьезно посмотреть на такие системы, как cocos2d, что является очень хорошим игровым движком. Он заботится обо всех этих деталях для вас и позволяет сосредоточиться на игровой части.
Оставаясь в рамках Apple, вы также должны взглянуть на Core Animation. Если вы перемещаете вещи на экране с помощью таймеров, вы не должны этого делать. Core Animation - это то, как вы перемещаете вещи на экране. Он заботится о многих деталях для вас, быстрее и потребляет гораздо меньше энергии, чем вы делали самостоятельно, и это приносит большую часть работы на GPU (как я упоминал выше). Это немного больше предназначено для элементов пользовательского интерфейса, чем игр, но его можно определенно использовать для создания простых игр.
И, конечно, там GLKit, но это совсем другая вещь....