SDL 帧速率上限实施

Posted

技术标签:

【中文标题】SDL 帧速率上限实施【英文标题】:SDL FrameRate cap implementation 【发布时间】:2018-10-25 23:34:40 【问题描述】:

我是游戏开发的新手,我已经使用 SDL2 制作了一些程序。帧速率不是什么大问题,因为我从未计划发布这些程序,只是使用 SDL_RENDER_PRESENTVSYNC 将帧速率限制为 60(我的显示器的刷新率)。现在我想做一个可以发送给朋友的应用程序,我想知道我的帧率实现是否好。

unsigned int a = SDL_GetTicks();
unsigned int b = SDL_GetTicks();
double delta = 0;

while (running)

    a = SDL_GetTicks();
    delta += a - b;

    if (delta > 1000/60.0)
    
        std::cout << "fps: " << 1000 / delta << std::endl;

        Update();
        Render();
        delta = 0;
    

    b = SDL_GetTicks();

我有一种很好的感觉,我已经把我的计算搞砸了,但是我在网上找到的许多其他实现通常看起来很冗长。如果可能的话,我想在游戏循环中保持帧帽实现并尽可能简单。任何帮助表示赞赏!

【问题讨论】:

pssst 欢迎来到 Stack Overflow!如果您认为代码可以正常工作,请考虑在Code Review 上以更完整的方式展示您的工作(及其单元测试)。您可能会得到一些建议,使其更高效、更易于阅读和更好地测试。在你这样做之前,请务必先阅读A guide to Code Review for Stack Overflow users,因为那里有些事情的处理方式不同 - 例如。问题标题应该简单地说明代码做了什么,因为问题总是“我该如何改进?”。 【参考方案1】:

您应该将b = SDL_GetTicks(); 行放在if 语句内和Update(); 之前。和delta = a - b 而不是delta += a - b。 并且你也可以使用b=a 而不是调用SDL_GetTicks() 函数。

while (running)

    a = SDL_GetTicks();
    delta = a - b;

    if (delta > 1000/60.0)
    
        std::cout << "fps: " << 1000 / delta << std::endl;

        b = a;    

        Update();
        Render();
    

【讨论】:

以上是关于SDL 帧速率上限实施的主要内容,如果未能解决你的问题,请参考以下文章

固定时间步长游戏循环中的帧速率上限 - Java

速率限制系列part2—作用于API网关的速率限制

SDL图解

安全开发流程(SDL)

F5 VPR与5050作N+M Scale实施问题记录

安全开发生命周期详解(SDL:Security Development Lifecycle)