您好我正在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;
}
答案 0 :(得分:0)
显然,评论中提到的VSYNC标志为LogicStuff。但还有更多:
计时器和计算的准确性不会削减它。假设你得到1毫秒的delta(你可以得到最小的delta)你将得到1000/1的结果。如果绘制速度超过1毫秒,则计算1000/0。幸运的是,你没有在这里崩溃但得到0结果。
您最好计算在1秒的时间段内渲染的帧数。
另请注意,仅仅因为SDL_Ticks()返回一个以毫秒为单位的值,这并不意味着准确报告的delta值精确到1毫秒。我希望它能在大约报告增量。 10毫秒的步骤(或者甚至更糟)。 SDL_Ticks不是一个高性能计数器。