【问题标题】:SDL2 - Vsync not workingSDL2 - 垂直同步不工作
【发布时间】:2015-06-20 12:13:04
【问题描述】:

我在我的程序中使用 vsync,它可以正常工作,直到我最小化窗口。我在创建渲染器时这样做了:

renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

这是游戏循环:

while (running)
{
    checkEvent();
    handleKeyboard(timer.getDelta());

    render();
}

它为我提供了稳定的每秒 60 帧,但是当我最小化窗口时,我每秒获得超过 100000 帧。为什么会这样?

【问题讨论】:

    标签: c++ sdl-2


    【解决方案1】:

    可能只是 SDL 中的一个错误。如果您对问题进行了更多调查:阅读文档做一些测试,您可以报告错误。它可能很快就会得到修复。 Ryan 和同事工作得很好。 :)

    话虽如此。我永远不会假设 Vsync 可以在每个系统上运行。您可能想添加自己的帧速率限制系统。依靠硬件来限制帧率是个坏主意。


    编辑: 我在我的游戏中使用它来限制帧率:

    while (!gameLoop->done)
    {
        int start = SDL_GetTicks();
        gameLoop->update();
        int time = SDL_GetTicks() - start;
        if (time < 0) continue; // if time is negative, the time probably overflew, so continue asap
    
        int sleepTime = gameLoop->millisecondsForFrame - time;
        if (sleepTime > 0)
        {
            SDL_Delay(sleepTime);
        }
    }
    

    【讨论】:

    • 那我应该使用SDL_Delay来限制帧率吗?
    • 帧率限制与垂直同步有何关系?它甚至不能消除屏幕撕裂,而且延迟可能超出要求。虽然 limit 有其用途,但它并不是 vsync 的真正替代品。
    • 启用垂直同步后,帧率将被限制为所选的视频模式刷新率。所以这是可变的。垂直同步应该修复撕裂。如果不是您的情况,则视频模式可能对您的屏幕来说太快了。请注意,并非所有视频模式都是 60Hz。因此,将其用作帧速率限制是个坏主意。
    • 我将您的代码放入我的程序中,这使得单击退出按钮变得困难,因为您必须在 SDL_Delay 调用之间单击。有没有办法解决这个问题?
    • @BradyDean:这很奇怪......我从来没有经历过这样的事情。您应该只处理事件队列中的每个事件。其中一个事件将是 SDL_QuitEvent。看看 SDL 中的事件处理。 wiki.libsdl.org/SDL_PollEvent
    猜你喜欢
    • 2018-05-11
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多