OSX でシンプルなグラフィカル アプリを作成しています。フレーム間のシステム時間の差をチェックすることで、フレームレートの監視を開始しました。数フレームごとに少しぶら下がっているようです。
アプリは、現在 200 fps (5 ミリ秒フレーム) に設定されている NSTimer オブジェクトで実行されます。メイン コードが遅いだけではないことを確認するために、[self.context flushBuffer]; を除くメイン ループ全体をコメント アウトしました。(もちろん、フレームレートのサンプリング コードも)。この単一の呼び出しを繰り返しても、一度に複数のフレームでハングします。コンソール出力の例を次に示します。
4
5
6
10
5
5
5
4
6
10
5
5
5
5
5
5
20
4
5
6
20
5
5
5
これは、各ループ反復間のミリ秒単位の時間です。200 fps では、フレームごとに約 5 ミリ秒になるはずですが、10、15、または 20 ミリ秒も繰り返しハングします。-initOpenGL 関数でわかるように、Vsyncing は無効になっています。
-(void)initOpenGL{
NSOpenGLPixelFormatAttribute attributes[] = {NSOpenGLPFADoubleBuffer, 0};
NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc] initWithAttributes: attributes];
self.context = [[NSOpenGLContext alloc] initWithFormat:pixelFormat shareContext:nil];
[self.context setView:[self.window contentView]];
[self.context makeCurrentContext];
//Disable Vsync
int temp = 0;
[self.context setValues: &temp forParameter: NSOpenGLCPSwapInterval];
glViewport(0, 0, windowWidth, windowHeight);
glMatrixMode(GL_PROJECTION);
glOrtho(0, windowWidth, 0, windowHeight, -1, 100);
//Flip all textures right side up
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
glScalef(1.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_SCISSOR_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
編集、新しい情報:これは、ダブルバッファリングとシングルバッファリングに関係があることを確認できます。DoubleBuffer 属性なしで NSOpenGLPixelFormat を初期化すると、200 fps で完全に実行されます。その属性では、私は吃音を続けています。