Я не знаю, в частности, об iPhone, но все же могу помочь:
Вместо того, чтобы просто подключать фиксированную задержку в конце цикла, используйте следующее:
- Определите интервал обновления, который вас устраивает, и он больше одного прохода через ваш основной цикл.
- В начале цикла возьмите текущую временную метку любого имеющегося разрешения и сохраните ее.
- В конце цикла возьмите другую временную метку и определите время, прошедшее с последней временной метки (инициализируйте его перед циклом).
- сон / задержка для разницы между вашим идеальным временем кадра и уже прошедшим временем для кадра.
- В следующем кадре вы даже можете попытаться компенсировать неточности в интервале ожидания путем сравнения с отметкой времени в начале предыдущего цикла. Сохраните разницу и добавьте / вычтите ее из интервала ожидания в конце этого цикла (режим сна / задержки может быть слишком длинным ИЛИ слишком коротким).
Возможно, вы захотите иметь механизм оповещения, который позволит вам знать, если у вас слишком мало времени (например, если ваше время сна после всех компенсаций меньше 0, что означает, что вы тратите больше времени) обрабатывать, чем позволяет ваша частота кадров). В результате ваша игра замедлится. Для получения дополнительных очков вы можете на некоторое время упростить рендеринг, если обнаружите, что это происходит, до тех пор, пока у вас снова не будет достаточно свободного места.