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

OpenGL 2D agents animation and scenario refresh

本文关键字:刷新 动画 2D 代理 OpenGL      更新时间:2023-10-16

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

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

现在我的"游戏"的帧速率是40fps,但游戏有一个闪烁的效果,看起来真的很奇怪。

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

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

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

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

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

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

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

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

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

2-4.是的-希望这能帮助你理解为什么你必须。。。

想象一下你有两张纸。第一张纸上你画了一个站着不动的棍子人,并把它展示给别人。

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

现在你给他们看第二张纸,当他们看着第二张时,你清空第一张纸,画出那个人的手臂再动一点。

这就是它的工作原理,也是为什么无论什么都没有改变,都必须始终渲染整个图像的原因。