【发布时间】:2013-09-18 00:30:51
【问题描述】:
我正在为一个学校项目制作 2D 游戏。我老师给的模板效果很好,但是我想替换代码中一个非常非常愚蠢的东西。在代码中,他调用了 20 次重方法来减慢游戏速度。而不是这样做,我想检查是否应该处理下一帧。
游戏是模板命名空间内的一个对象。这个命名空间有一个无限循环,它调用游戏滴答方法并交换帧缓冲区。
在这个模板中,我用一个简单的 if 语句替换了 Game->Tick():
if (game->Ready(lastftime)) {
game->Tick();
}
lastframe 是上次调用与现在之间的时间差(以秒为单位)。 我知道我可以利用这段时间来计算游戏中的动作,但这不是我现在想做的!
这是Ready 方法:
bool Game::Ready(float timedif) {
// Add time to framecounter
framecounter += timedif;
// Check if the counter over lapses the fps
if (framecounter > fps) {
// If so, substract the fps from the counter
while (framecounter > fps) {
framecounter -= fps;
}
m_Screen->Clear(0);
Draw();
return true;
}
// Frame is still inside the fps margin
return false;
}
fps 计算如下:fps = 1000.0f/60
我不知道为什么它不能以每秒 60 帧的速度运行,而且我 100% 肯定它的调用次数超过了这个速度(用 printf 进行了测试)。任何帮助将不胜感激。
【问题讨论】:
-
你传递给
Ready的lastftime是什么?名称暗示了一个时间点,但在 Ready 中,您将其视为差异 -
如果
difference是以秒为单位的时间,您将很难计算出高于 1fps 的帧... -
还有
fps变量表示帧之间的毫秒数,而不是每秒帧数 -
@nyarlathotep 非常正确。这已经在模板中,但我可以更改名称。
-
@Paddyd 没错,我首先尝试了另一种方式,它只是一个整数,现在使用相同的变量。
标签: c++ frame-rate