帧速率不受限制时,SDL2和OpenGL停顿

我试图写出游戏引擎性能的概要文件,但发现了一个结结巴巴的问题。 该引擎是使用SDL2和OpenGL用C ++编写的,游戏循环只是一个无限循环,类似于以下伪代码:

SDL_GL_SetSwapInterval(1); // Enabled vsync
while (true) {
    poll_events();
    update();
    draw();
    SDL_GL_SwapWindow(window);
    elapsed = get_ms_since_last_frame();
    if (elapsed < 16.666) {
      SDL_Delay(16.666 - elapsed);
    }
}

但是,在进行基准测试时,我注意到以下几点:当屏幕上的精灵数量太大(即不再能够以60fps的速度渲染)时,屏幕显示出非常明显的卡顿(视觉上,每个卡顿延迟了大约200毫秒,并且间隔大约300毫秒)。我对循环进行了计时,结果表明每个循环只需要30毫秒(应该转换为30 fps,而不是口吃的5 fps)。

如果我将帧速率限制器的延迟延迟匹配为 30 fps 而不是60,则结实的消失,即视觉上显示30 fps。

只要帧速率限制器没有生效(即关闭或以高于最快速率的帧速率进行上限),似乎就会出现口吃现象。当我仅渲染少量精灵但同时禁用vsync和framerate limiter时,甚至发生口吃,这很奇怪,因为在这种情况下,每帧仅花费约6ms的时间,不足以引起任何口吃。

口吃是整个操作系统的:所有窗口动画在发生时也会口吃。

我的猜测是OS图形卡无法以某种方式跟上全负荷渲染,从而造成了结结。但我确实注意到,即使理论上它们也处于满负荷运行,视频游戏的运行速度都可以低于60fps(无法跟上时),而不会出现卡顿问题。

即使无法以60fps的速度渲染,游戏引擎如何提供平滑的帧率?

我正在使用具有OpenGL 4.1和SDL2 2.0.10的macOS Mojave(MacBook Pro 2015,Intel Iris Pro Graphics)。

w910488011 回答:帧速率不受限制时,SDL2和OpenGL停顿

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2991101.html

大家都在问