0

私は次のコードを持っており、シーンのフレームレートを計算するための正しいコードを記述したことを確認するために、他のセットを取得したいと考えていました。チャイムを入れていただけませんか?

これは、SDK3.2を使用してiPad用に作成されています。

ありがとう!

- (void)drawView:(id)sender
{
 mach_timebase_info_data_t timer;

 mach_timebase_info(&timer);
 uint64_t t1 = mach_absolute_time();

    [renderer render];

 uint64_t delta = mach_absolute_time() - t1;
 delta *= timer.numer;
 delta /= timer.denom;

 NSLog(@"%lld ms: %.2f FPS", delta, 1000000000.0f/delta);
}
4

3 に答える 3

1

OpenGL のレンダリングに費やされた時間を測定したい場合、これは機能しません。OpenGL 操作は並行して処理され、CPU のタイミングには影響しません。OpenGL 呼び出しを発行するのにかかる時間をプロファイリングできますが、完了するまでにかかった時間を確認することはできません。

これは残念ですが、理にかなっています。GPU が時間内に処理を終了できない場合、CPU がブロックされ、タイマー (CADisplayLink の可能性が最も高い) が「時間内に」起動しません。

gDEBugger のような (高価な) プロファイリング ツールを調べたいと思うかもしれませんが、それらが iOS で動作するかどうかはわかりません。

于 2010-10-26T09:05:24.940 に答える
0

CFAbsoluteTime を使用して、openGL アプリでフレーム期間を計算します。結果が信頼できないため、mach_time の使用をやめました。

- (void)update {

    // Compute Frame Duration
    static CFAbsoluteTime sPreviousTime = 0;
    const CFAbsoluteTime newTime = CFAbsoluteTimeGetCurrent();
    const CFAbsoluteTime deltaTime = newTime - sPreviousTime;
    sPreviousTime = newTime;
    float frameDuration = deltaTime;
    // keep frameDuration in [0.01 ; 0.5] seconds
    if (frameDuration > 0.5f) {
        frameDuration = 0.5f;
    } else if (frameDuration < 0.01f) {
        frameDuration = 0.01f;
    }

    [self tick:frameDuration]; // use frameDuration to do something every frame

}
于 2012-12-13T16:07:54.140 に答える
0

短い答え:はい、あなたがしていることは正しいです。

より長い答え: 2 つの 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 が得られるため、すべてが意図したとおりに機能するはずです。

于 2014-07-19T09:48:05.877 に答える