これが起こることです:
提案されているように、 drawGL 関数は のおかげでフレームの正確な最後に呼び出され
usleep
ます。これにより、すでに安定したフレームレートが維持されています。レンダバッファの実際のプレゼンテーションは で行われ
drawGL()
ます。これにかかる時間を測定すると、実行時間が変動し、アニメーションが途切れます。このタイマーは mach_absolute_time を使用するため、非常に正確です。フレームの最後で、 を測定し
timeDifference
ます。はい、平均で 1 ミリ秒ですが、大きくずれており、0.8 ミリ秒から 1.2 ミリ秒の範囲で、最大 2 ミリ秒を超えるピークがあります。
例:
// Every something of a second I call tick
-(void)tick
{
drawGL();
}
- (void)drawGL
{
// startTime using mach_absolute_time;
glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
// endTime using mach_absolute_time;
// timeDifference = endTime - startTime;
}
私の理解では、フレームバッファが作成されたら、フレームの複雑さに関係なく、レンダバッファを提示するには常に同じ努力が必要です? これは本当ですか?そうでない場合、どうすればこれを防ぐことができますか?
ちなみにこれはiPhoneアプリの例です。ここでは OpenGL ES について話していますが、これはプラットフォーム固有の問題ではないと思います。もしそうなら、何が起こっているのですか?そして、これは起こってはいけませんか?繰り返しますが、もしそうなら、どうすればこれを防ぐことができますか?