2

我无法为我的 OpenGL 应用程序创建可靠的游戏引擎。这是一款由多个动作的精灵组成的游戏。

我创建的对象基本上都是我的精灵。另一个名为“gameEngine”的对象每隔几秒(一个计时器)循环执行一组计算,从而产生新的游戏变量。之后,精灵对象现在知道它们的绘图数据。

问题是,在收集了我所有的绘图数据后,绘图应该在正确的时间进行,从而产生稳定的动画。根据当前场景的复杂性,游戏计算需要不确定的时间量。因此,实际绘图发生在不同的时间点。我将如何防止这种情况发生?

为了澄清,我的方法是这样的:

// Every something of a second I call tick
-(void)tick
{
  drawingData = gameEngine();
  draw(drawingData); 
}

必须有构建这样的游戏引擎的最佳实践我不知道吗?

4

4 回答 4

6

游戏循环有很多种,但更好的循环将动画与绘图或更经典的术语模型和视图分开。基本上,您想构建一个游戏模型,您可以在其中建立时间流逝并更新模型(物理帧率),然后在连续时刻独立渲染模型的快照(渲染帧率)。

这里有几篇文章更详细地解释了游戏循环的一些变化及其优缺点。也有源代码。我希望它有所帮助。

修复你的时间步长!deWiTTERS 游戏循环文章

于 2009-03-13T02:30:15.530 回答
1

这真的与 OpenGL 无关。它更多地与您正在使用的操作系统或系统 API(即 Carbon/Cocoa/Win32)有关。但真正非常简单的情况是这样的(伪代码):

checkTime = currentTime
while not exitCondition
    if currentTime - checkTime >= 50 milliseconds
        checkTime = checkTime + 50 milliseconds
        updateScene
    else drawScene

您尽可能频繁地绘制,但仅每 50 毫秒更新一次(即每秒 20 次)。显然还有很多其他的事情需要考虑,尤其是当你落后(跳帧)时你会做什么。

了解 OpenGL 内容的最佳地点是 Nehe 的课程:

http://nehe.gamedev.net/lesson.asp?index=01

它们有点过时了,但每节课底部的示例代码是一个很好的起点,它有多种语言和多种操作系统可用。

于 2009-03-13T01:19:37.807 回答
0

它在某种程度上取决于平台,但通常有效的一种基本方法是在渲染循环中使用高性能计时器,并使用它来帮助您在帧之间休眠,以获得稳定、稳定的帧速率。

您可以对帧的渲染进行计时,然后按数量休眠以保持稳定的帧速率。

但是,如果您的平台无法跟上您想要达到的帧速率,您将需要开始寻找优化游戏引擎的方法。这只会减慢速度以使它们保持一致和流畅 - 而不是加快速度。

--- 澄清 ----

-(void)tick
{
    time = now() // from high perf. timer
    drawingData = gameEngine();

newTime = now()
// pause for the time required to make the framerate consistent
Sleep(totalTimeForTickToBeStable - newTime + time)
draw(drawingData); 

}

于 2009-03-13T01:04:31.650 回答
0

最好的解决方案是多线程应用程序——一个线程将绘图数据计算到缓冲区中,一个线程渲染数据。

如果您正在寻找一个非常简单的解决方案,只需颠倒计算和渲染的顺序即可。

void Initialize()
{    
   DrawingData = GameEngine();
}

void Tick()
{
   Draw(DrawingData);
   DrawingData = GameEngine();
}

您在应用程序启动时计算第一个绘图数据,当计时器触发时,您只需绘制它。之后,您可以一直到下一个计时器事件再次计算绘图数据。

但总的来说,以可变帧速率渲染可能是更好的解决方案 - 如果机器要慢到您想要的帧速率并且您在快速机器上提供高帧速率,您可以避免这些问题。

void Main()
{
   StartTime = Now();

   while (!ExitRequested)
   {     
      DrawingData = GameEngine(Now() - StartTime);
      Draw(DrawingData);
   }
}

您尽可能快地渲染帧 - 不是每个帧之间的固定间隔,而是应用程序运行的实时时间。这意味着不要每帧将对象推进 20 毫秒,只需将它们移动到当前运行时间表示的位置即可。

于 2009-03-13T02:30:04.453 回答