0

我正在尝试做一个 2D 小游戏来学习如何做并提高我的编程技能。我使用 C++/C 和 OpenGL 3.0 和 GLUT 对游戏进行编程。我对一些关于动画和场景刷新的重要概念感到困惑。

  1. 只有在关卡开始时才加载所有纹理是一个好习惯?
  2. 我将 fps 速率选择为 40 fps,我应该重绘所有场景和每一帧中的代理还是只重绘修改?
  3. 在代理动画中,我应该重绘所有的代理还是只重绘从过去发生变化的部分?
  4. 如果场景的某些部分发生变化(一堵墙或类似的东西被破坏),我应该重绘整个场景还是只重绘发生变化的部分?

现在我的“游戏”以 40fps 的帧速率运行,但游戏的闪烁效果看起来很奇怪。

4

3 回答 3

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

  2. 重新绘制整个场景几乎总是更便宜。GPU 就是为此而构建的,速度非常快。

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

  3. 取决于你如何定义动画。如果您正在谈论类似精灵的动画,其中每一帧都是单独的图像,那么仅参考新纹理并重绘是最便宜的。

    如果你有一个纹理图集,更新纹理坐标并重绘,如果你正在使用着色器(如果你想成为 OpenGL 3.0,你几乎必须这样做),你可能能够摆脱一个偏移的制服纹理坐标。

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

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

于 2013-02-07T22:11:34.227 回答
1

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

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

于 2013-02-07T21:58:02.857 回答
1
  1. 是的

2-4。是的-希望这可以帮助您理解为什么必须...

想象一下,你有 2 张纸。第一张纸你画了一个站着不动的火柴人,然后给别人看。

第二张纸,当用户在看那张纸时,你又画了同样的东西,但这次你稍微移动了手臂。

现在你给他们看第二张纸,当他们看第二张纸时,你清除第一张纸并画出那个人稍微移动他的手臂。

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

于 2013-02-07T22:29:55.593 回答