Я склонен использовать CADisplayLink для запуска новых кадров и простого вычисления времени в запросе кадров, чтобы выяснить, насколько далеко продвинется моя логика.
Предположим, у вас есть переменная-член timeOfLastDraw типа NSTimeInterval,Вы хотите, чтобы ваша логика работала, скажем, со скоростью 60 ударов в секунду.Затем (с целой кучей переменных, чтобы сделать код более понятным):
- (void)displayLinkDidTick
{
// get the time now
NSTimeInterval timeNow = [NSDate timeIntervalSinceReferenceDate];
// work out how many quantums (rounded down to the nearest integer) of
// time have elapsed since last we drew
NSTimeInterval timeSinceLastDraw = timeNow - timeOfLastDraw;
NSTimeInterval desiredBeatsPerSecond = 60.0;
NSTimeInterval desiredTimeInterval = 1.0 / desiredBeatsPerSecond;
NSUInteger numberOfTicks = (NSUInteger)(timeSinceLastDraw / desiredTimeInterval);
if(numberOfTicks > 8)
{
// if we're more than 8 ticks behind then just do 8 and catch up
// instantly to the correct time
numberOfTicks = 8;
timeOfLastDraw = timeNow;
}
else
{
// otherwise, advance timeOfLastDraw according to the number of quantums
// we're about to apply. Don't update it all the way to now, or we'll lose
// part quantums
timeOfLastDraw += numberOfTicks * desiredTimeInterval;
}
// do the number of updates
while(numberOfTicks--)
[self updateLogic];
// and draw
[self draw];
}
В вашем случае updateLogic будет применять фиксированное количество вращения.Если постоянное вращение действительно все, что вам нужно, вы можете просто умножить постоянную вращения на numberOfTicks или даже пропустить весь этот подход и сделать что-то вроде:
glRotatef([NSDate timeIntervalSinceReferenceData] * rotationsPerSecond, 0, 0, 1);
вместо сохранения своей собственной переменной.В любом случае, кроме самого тривиального случая, вы обычно хотите делать целую кучу сложных вещей за квант времени.