Tag: 游戏循环

恒定的游戏速度独立于OpenGL与GLUT中的可变FPS?

我一直在阅读Koen Witters关于不同游戏循环解决方案的详细文章 ,但是我在使用GLUT实现最后一个时遇到了一些问题,这是推荐的。 在阅读了几篇关于如何实现恒定游戏速度的文章,教程和代码之后,我认为我目前已实现的内容(我将在下面发布代码)是Koen Witters所谓的Game Speed依赖于可变FPS ,第二篇关于他的文章。 首先,通过我的搜索经验,有几个人可能有帮助,但不知道什么是GLUT,我将尝试解释(随意纠正我)相关的function我的这个OpenGL工具包的问题。 如果您知道GLUT是什么以及如何使用它,请跳过此部分。 GLUT工具包: GLUT是一个OpenGL工具包,可以帮助完成OpenGL中的常见任务。 glutDisplayFunc(renderScene)接受一个指向renderScene()函数回调的指针,该回调将负责渲染所有内容。 renderScene()函数仅在回调注册后调用一次。 glutTimerFunc(TIMER_MILLISECONDS, processAnimationTimer, 0)在调用回调processAnimationTimer()之前需要经过的毫秒数。 最后一个参数只是一个传递给计时器回调的值。 processAnimationTimer()不会在每个TIMER_MILLISECONDS而只需调用一次。 glutPostRedisplay()函数请求GLUT渲染一个新帧,所以每当我们改变场景中的某些东西时我们都需要调用它。 glutIdleFunc(renderScene)可用于向renderScene()注册回调(这不会使glutDisplayFunc()无关)但应避免使用此函数,因为在未接收到事件时会持续调用空闲回调,从而增加CPU负载。 glutGet(GLUT_ELAPSED_TIME)函数返回自调用glutGet(GLUT_ELAPSED_TIME)或首次调用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 […]