我正在 OSX 上制作一个简单的图形应用程序。我刚开始通过检查帧之间的系统时间差异来监控帧速率。它似乎每隔几帧就会挂起。
该应用程序在 NSTimer 对象上运行,当前设置为 200 fps(5 毫秒帧)。为了确保不仅仅是我的主代码变慢了,我注释掉了整个主循环,除了 [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 函数中所见,垂直同步已禁用。
-(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 的速度完美运行。而有了这个属性,我继续口吃。