Существенная проблема заключается в следующем:
ваша игра должна обновляться в зависимости от времени, прошедшего с момента последнего рендеринга, а не от того, сколько раз она рендерилась.Предположим, вы вычисляете положение спрайта на основе некоторой скорости.Новая позиция должна рассчитываться на основе времени между рендерами, а не с предположением, что с момента последнего рендеринга прошло 0,002 секунды.Это называется FPS-независимой анимацией.
Итак, вот простой пример:
// FPS dependent animation
int x = sprite.x + sprite.velocity.x
Правильный способ сделать это - использовать время с момента последнего рендеринга и обновлять его пропорционально.В следующем коде предполагается, что 0,002 является временной базой.
// FPS independent animation
int x = sprite.x + sprite.velocity.x * time_since_last_render/0.002
На устройстве, на котором рендеринг занимает вдвое больше, следующее обновление будет перемещать объект вдвое дальше, поэтому он окажется в том же месте, что иэто было бы на более быстром устройстве.
Побочная проблема, вы не всегда должны рендерить следующий кадр на 0,002 секунды в будущем.Вы должны увидеть, сколько времени потребовалось для рендеринга текущего кадра, вычтите это из 0,002 и используйте это для планирования следующего рендера.Естественно, это число будет иметь минимальное значение ноль, поэтому на медленных устройствах вы не начнете планировать в прошлое.Например, если вашей функции рендеринга требуется ровно 0,002 секунды, это излишне снизит частоту кадров вдвое.