SDL 2.0在每台机器上保持不变的FPS

时间:2016-02-20 18:32:42

标签: c++

您好我正在SDL2中开发一款出色的游戏,并且我添加了一个FPS调节器以使其在每台机器上都流畅,但随后我创建了一个示例程序来输出fps(不调节,只是输出以查看当前的功率它运行的机器)我已经在2台不同的计算机上进行了测试,其中一台是12年,第二台是新的,旧的有512 mb ram,新的有16gb,它们都向我展示了这个示例代码在62.5 FPS下运行,我很确定我没有正确计算我的fps,请问有什么不对吗?

#include<SDL.h>
#include<iostream>
#include<sstream>
#include<string>

int main(int argc, char *argv[])
{
    SDL_Init(SDL_INIT_VIDEO);
    SDL_Window *window = nullptr;
    Uint32 startclock = 0;
    Uint32 deltaclock = 0;
    Uint32 currentFPS = 0;
    window = SDL_CreateWindow("Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 640, 480, SDL_WINDOW_SHOWN);
    SDL_Renderer *renderTarget = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
    SDL_Texture *texture = NULL;

    bool isRunning = true;
    SDL_Event ev;

    while (isRunning)
    {
        startclock = SDL_GetTicks();
        while (SDL_PollEvent(&ev) != 0)
        {
            if (ev.type == SDL_QUIT)
                isRunning = false;
        }
        SDL_RenderClear(renderTarget);
        SDL_RenderCopy(renderTarget, texture, NULL, NULL);
        SDL_RenderPresent(renderTarget);

        deltaclock = SDL_GetTicks() - startclock;
        startclock = SDL_GetTicks();

        currentFPS = 1000.0f / deltaclock;
        std::string x;
        std::stringstream ss;
        ss << currentFPS;
        ss >> x;
        x = "FPS: " + x;
        SDL_SetWindowTitle(window, x.c_str());
    }
    return 0;
}

1 个答案:

答案 0 :(得分:0)

显然,评论中提到的VSYNC标志为LogicStuff。但还有更多:

计时器和计算的准确性不会削减它。假设你得到1毫秒的delta(你可以得到最小的delta)你将得到1000/1的结果。如果绘制速度超过1毫秒,则计算1000/0。幸运的是,你没有在这里崩溃但得到0结果。

您最好计算在1秒的时间段内渲染的帧数。

另请注意,仅仅因为SDL_Ticks()返回一个以毫秒为单位的值,这并不意味着准确报告的delta值精确到1毫秒。我希望它能在大约报告增量。 10毫秒的步骤(或者甚至更糟)。 SDL_Ticks不是一个高性能计数器。