OpenGL 2D代理动画和场景刷新

时间:2013-02-07 21:49:35

标签: c++ opengl animation

我正在尝试用二维游戏来学习如何操作并提高我的编程技巧。我使用C ++ / C和OpenGL 3.0与GLUT编程游戏。 我对一些关于动画和场景刷新的重要概念感到困惑。

  1. 只有在关卡开始时才加载所有纹理?
  2. 我选择fps速率为40 fps,我应该重新绘制所有场景和每个帧中的代理还是只修改?
  3. 在代理动画中,我应该重新绘制整个代理还是仅重绘过去的部分?
  4. 如果场景的某些部分发生变化(一面墙或类似的东西被毁坏)我是否需要重新绘制整个场景或仅重新变换的部分?
  5. 现在我的“游戏”以40fps的帧速率工作,但游戏具有闪烁效果,看起来非常奇怪。

3 个答案:

答案 0 :(得分:3)

  1. 是的,每帧创建和删除纹理/缓冲区都是一个巨大的浪费。

  2. 重新绘制整个场景几乎总是更便宜。 GPU是为了实现这一目标而建立的,速度非常快。

    将帧缓冲区从VRAM读回常规RAM并计算差异会慢得多,特别是因为OpenGL不跟踪你的“对象”,它一次只需要一个三角形,然后栅格化它,然后忘了它。

  3. 取决于您如何定义动画。如果你在谈论精灵般的动画,每个帧都是一个单独的图像,那么只需要参考新的纹理并重新绘制它就是最便宜的。

    如果您有纹理图集,请更新纹理坐标并重新绘制,如果您正在使用着色器(如果您想成为OpenGL 3.0,则几乎必须这样做),您可能可以使用制服抵消纹理坐标。

  4. 是的,正如我之前所说,硬件是为清除屏幕并重新绘制所有内容而构建的。

  5. 对于帧速率,您应该使用显示器的刷新率来避免垂直撕裂。现在几乎所有的显示器都是60Hz,所以60fps是最常见的“目标”帧速率。

答案 1 :(得分:1)

选择30或60 fps,因为大多数现代显示器以60 Hz的速率刷新。因此,每个“监视器帧”有2个或1个渲染帧。这应该减少闪烁效应。 (如果你的意思是“闪光效果”,我不是100%肯定。)

关于所有其他问题(听起来几乎相同):在OpenGL渲染中,重绘所有内容非常常见,因为在大多数游戏中,几乎整个屏幕在每一帧中都会发生变化,例如,如果您正在四处移动。你可以进行部分屏幕更新,但它在CPU方面非常罕见且更昂贵,因为你必须计算要绘制的部分而不是“绘制所有内容”。

答案 2 :(得分:1)

  1. 2-4。是的 - 希望这有助于您理解为什么必须......

    想象一下,你有两张纸。第一篇论文,你画一个坚持不懈的棍子男人,并向某人展示。

    第二篇论文在用户正在看那张纸的时候你再次画了同样的东西,但这次你移动了一下手臂。

    现在你向他们展示第二篇论文,因为他们看了第二篇论文,你清理了第一篇论文并画了那个男人更多地移动他的手臂。

    这几乎是它的工作原理,并且无论是否有任何变化,您都必须始终渲染整个图像。