我最近在Game Loops上阅读了这篇文章:http : //www.koonsolo.com/news/dewitters-gameloop/
推荐的最后一种实现方式使我深感困惑。我不明白它是如何工作的,看起来像是一团糟。
我了解以下原则:以恒定的速度更新游戏,剩下的一切将使游戏尽可能多地渲染。
我认为您不能使用:
- 获取输入的25个报价
- 渲染游戏975次
方法,因为您将在第二部分的第一部分得到输入,这会感觉很奇怪吗?还是那是文章中正在发生的事情?
实质上:
while( GetTickCount() > next_game_tick && loops < MAX_FRAMESKIP)
那怎么有效呢?
让我们假设他的价值观。
MAX_FRAMESKIP = 5
让我们假设next_game_tick,它是在初始化之后的瞬间分配的,在说主游戏循环之前... 500。
最后,由于我在游戏中使用SDL和OpenGL,并且仅将OpenGL用于渲染,因此假设GetTickCount()
返回自调用SDL_Init以来的时间。
SDL_GetTicks -- Get the number of milliseconds since the SDL library initialization.
资料来源:http : //www.libsdl.org/docs/html/sdlgetticks.html
作者还假设:
DWORD next_game_tick = GetTickCount();
// GetTickCount() returns the current number of milliseconds
// that have elapsed since the system was started
如果我们扩展该while
语句,则会得到:
while( ( 750 > 500 ) && ( 0 < 5 ) )
750,因为已next_game_tick
分配时间已过去。loops
如您在文章中所见,它为零。
现在我们进入了while循环,让我们做一些逻辑并接受一些输入。
Yadayadayada。
在while循环结束时,我提醒您,我们的主要游戏循环是:
next_game_tick += SKIP_TICKS;
loops++;
让我们更新while代码的下一次迭代的样子
while( ( 1000 > 540 ) && ( 1 < 5 ) )
1000,因为在到达下一个调用GetTickCount()的循环的实例之前,获取输入和执行操作已经过去了。
540,因为在代码1000/25 = 40中,因此,500 + 40 = 540
1因为我们的循环已经迭代了一次
5,你知道为什么。
因此,由于显然需要这个While循环,MAX_FRAMESKIP
而不是预期TICKS_PER_SECOND = 25;
的,游戏应该如何正确运行?
毫不奇怪,当我将其实现到我的代码中时,我可以正确添加,因为我只是简单地重命名了功能以处理用户输入并将游戏绘制为文章作者在其示例代码中所具有的功能,所以游戏什么也没做。
我放置了一个fprintf( stderr, "Test\n" );
while循环,直到游戏结束才打印。
如何保证游戏循环每秒运行25次,同时尽可能快地渲染?
对我而言,除非我缺少巨大的东西,否则看起来……什么都没有。
而且,这个while循环的结构不是应该每秒运行25次,然后完全按照我在本文开头提到的内容更新游戏吗?
如果是这样,我们为什么不能做一些简单的事情:
while( loops < 25 )
{
getInput();
performLogic();
loops++;
}
drawGame();
并以其他方式计算插值。
原谅我的冗长问题,但是这篇文章对我来说弊大于利。我现在非常困惑-由于所有这些出现的问题,也不知道如何实现适当的游戏循环。