我正在将steamworks sdk
实施到我的c++
/ OpenGL
引擎中。启用vsync时,只要存在蒸汽覆盖,CPU就会出现峰值。如果我关闭垂直同步并手动设置帧速率,则问题将消失。我想弄清楚为什么CPU会出现峰值,该怎么办。
我想出的是,我认为这与CPU和GPU之间的繁忙等待有关,从而使CPU停止运行。我已经监视了帧速率和更新速率,尽管CPU出现了上限,但它们都没有受到vsync的影响。
在启用vsync的情况下调用glReadPixels
时,我也会遇到一个类似的问题,据我了解,这通常与忙碌等待有关。使用glReadPixels
,您也许可以将读取调用的时间安排在周期中一个更适当的时刻,但是使用覆盖注入,我的理解是,这会注入到缓冲区交换本身中,因此无法移动。仅在启用vsync的情况下也会发生此问题。
编辑:更新图形驱动程序后,glReadPixels似乎不再是问题,而Steamworks overlay问题仍然相同。
我的测试计算机在nvidia gtx 1060显卡上运行,我想我读到某处nvidia容易忙于等待的情况,但这仅在这些特定情况下发生(存在覆盖或称为glReadPixels)。 / p>
OpenGL版本为330内核。
我的核心循环是什么样(缩小)
const double dt = 1.0 / TICKES_PER_SECOND;
double currentTime = SDL_GetTicks() / 1000.0;
double accumulator = 0.0;
while (_running) {
double newTime = SDL_GetTicks() / 1000.0;
double frameTime = newTime - currentTime;
if (frameTime > 0.25)
frameTime = 0.25;
currentTime = newTime;
accumulator += frameTime;
while (accumulator >= dt) {
HandleInput();
Update();
accumulator -= dt;
}
_alpha = accumulator / dt;
Render(_alpha);
if(_FPS){
double duration = SDL_GetTicks() / 1000.0 - _last_render_time;
const double frame_length = 1.0 / _FPS;
if (duration < frame_length) {
double sleep_duration = frame_length - duration;
SDL_Delay(sleep_duration * 1000.0);
}
_last_render_time = SDL_GetTicks() / 1000.0;
}
}
存在叠加层时的预期结果
存在叠加层时的实际结果