我试图写出游戏引擎性能的概要文件,但发现了一个结结巴巴的问题。 该引擎是使用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)。