启用Vsync后如何防止注入的(steamworks)覆盖的CPU峰值?

时间:2019-07-20 10:49:57

标签: c++ opengl vsync steamworks-api

我正在将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;
    }
}

存在叠加层时的预期结果

  • 〜60帧/秒
  • 〜每秒60次更新
  • CPU使用率约为1-3%

存在叠加层时的实际结果

  • 〜60帧/秒
  • 〜每秒60次更新
  • CPU使用率约为30%

0 个答案:

没有答案