我试图找到一个可靠的方法,能够准确设置我希望我的OpenGL应用程序在屏幕上呈现多少FPS.我可以通过休眠1000/fps毫秒在某种程度上做到这一点,但这没有考虑渲染所需的时间.哪种是将fps限制在所需数量的最一致方法?
我一直在阅读Koen Witters 关于不同游戏循环解决方案的详细文章,但是我在使用GLUT实现最后一个时遇到了一些问题,这是推荐的.
在阅读了几篇关于如何实现恒定游戏速度的文章,教程和代码之后,我认为我目前已实现的内容(我将在下面发布代码)是Koen Witters所谓的Game Speed依赖于可变FPS,第二篇关于他的文章.
首先,通过我的搜索经验,有几个人可能有帮助,但不知道什么是GLUT,我将尝试解释(随意纠正我)相关的功能我的这个OpenGL工具包的问题.如果您知道GLUT是什么以及如何使用它,请跳过此部分.
GLUT工具包:
glutDisplayFunc(renderScene)采用指向一个renderScene()回调函数,这将是负责呈现的一切.该renderScene()函数仅在回调注册后调用一次.glutTimerFunc(TIMER_MILLISECONDS, processAnimationTimer, 0)需要的毫秒数调用回调之前通过processAnimationTimer().最后一个参数只是一个传递给计时器回调的值.该processAnimationTimer()不会叫每个TIMER_MILLISECONDS但只有一次.glutPostRedisplay()函数请求GLUT渲染一个新帧,因此每当我们改变场景中的某些内容时我们都需要调用它.glutIdleFunc(renderScene)可用于注册一个回调renderScene()(这并没有使glutDisplayFunc()无关),但应避免使用此功能,因为没有被接收到事件时的空闲回调不断要求,增加了CPU的负载.glutGet(GLUT_ELAPSED_TIME)函数返回自glutInit调用(或第一次调用glutGet(GLUT_ELAPSED_TIME))以来的毫秒数.那是GLUT的计时器.我知道高分辨率计时器还有更好的选择,但是现在让我们继续使用这个计时器.我认为这是关于GLUT如何渲染帧的足够信息,所以那些不了解它的人也可以投入这个问题来试图帮助它们如果它们像它一样堕落.
目前的实施:
现在,我不确定我是否正确实施了Koen提出的第二种解决方案,游戏速度依赖于可变FPS.相关代码如下:
#define TICKS_PER_SECOND 30
#define MOVEMENT_SPEED 2.0f
const int TIMER_MILLISECONDS = 1000 / TICKS_PER_SECOND;
int previousTime;
int currentTime;
int elapsedTime;
void renderScene(void) {
(...)
// Setup the camera …Run Code Online (Sandbox Code Playgroud)