Краткий ответ: да, то, что вы делаете, правильно.
Более длинный ответ: чтобы получить время в секундах для дельты между двумя вызовами mach_absolute_time, вам нужно сделать следующее:
// I do this once at launch.
mach_timebase_info_data_t timer;
mach_timebase_info( &timer );
// Start time.
uint64_t t1 = mach_absolute_time( );
// Do activity.
// End time.
uint64_t t2 = mach_absolute_time( );
// Calculate delta.
uint64_t delta = t2 - t1;
// Use denom/numer from timer.
delta *= timer.numer;
delta /= timer.denom;
// Convert nanoseconds to seconds.
float secondsElapsed = ( float )( delta / 1000000000.0 );
Конечно, если вы хотите FPS, от вас потребуется обратное значение секунд:
1.0f / secondsElapsed;
В вашем случае вместо того, чтобы делать:
float secondsElapsed = ( float )( delta / 1000000000.0 );
Вы делаете:
float inverseSecondsElapsed = ( float )( 1000000000.0 / delta );
Таким образом, вы действительно получаете FPS, как задумано, поэтому все должно работать, как задумано.