gpt4 book ai didi

objective-c - 为什么 OpenGL 双缓冲在性能方面似乎不一致?

转载 作者:行者123 更新时间:2023-12-02 07:36:55 25 4
gpt4 key购买 nike

我正在 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 ms 左右,但它反复挂起 10、15 甚至 20 ms。 Vsyncing 已禁用,如您在我的 -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 的速度完美运行。然而,由于该属性,我仍然口吃。

最佳答案

在不知道实际渲染代码(未发布)的情况下,一个很可能的原因是首先使用 NSTimer 进行帧速率控制并不是一个好主意。请参阅文档(添加了重点):

A timer is not a real-time mechanism; it fires only when one of the run loop modes to which the timer has been added is running and able to check if the timer’s firing time has passed. Because of the various input sources a typical run loop manages, the effective resolution of the time interval for a timer is limited to on the order of 50-100 milliseconds.

因此,期望使用 5 毫秒之类的定时器从根本上是有缺陷的。

除此之外,可能还有其他影响(进程调度、纹理上传和 OpenGL 中的停顿等)会使帧时间不是 100% 恒定。尽管由这些引起的抖动通常会小得多。

关于objective-c - 为什么 OpenGL 双缓冲在性能方面似乎不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15392363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com