OpenGL 2D代理动画和场景刷新
OpenGL 2D agents animation and scenario refresh
我正在尝试用2D做一个小游戏,学习如何做,并提高我的编程技能。我使用C++/C和OpenGL 3.0与GLUT对游戏进行编程。我混淆了一些关于动画和场景刷新的重要概念。
- 只有在关卡开始时才加载所有纹理,这是一个很好的练习吗
- 我选择每秒40帧的帧速率,我应该重新绘制每帧中的所有场景和代理,还是只重新绘制修改
- 在代理动画中,我应该重新绘制整个代理,还是只绘制与过去不同的部分
- 如果场景的某个部分发生了变化(一堵墙或类似的东西被破坏),我应该重新绘制整个场景还是只绘制发生变化的部分
现在我的"游戏"的帧速率是40fps,但游戏有一个闪烁的效果,看起来真的很奇怪。
-
是的,每帧创建和删除纹理/缓冲区都是一种巨大的浪费。
-
重新绘制整个场景几乎总是更便宜。GPU就是为了做到这一点而构建的,速度非常快。
将帧缓冲区从VRAM读取回常规RAM并计算差异会慢得多,特别是因为OpenGL不跟踪你的"对象",它每次只需要一个三角形,光栅化它,然后忘记它。
-
取决于定义动画的方式。如果你谈论的是类似精灵的动画,其中每一帧都是一个单独的图像,那么只参考新纹理并重新绘制是最便宜的。
如果你有一个纹理图谱,更新纹理坐标并重新绘制,如果你使用着色器(如果你想成为OpenGL 3.0,你几乎必须这样做),你可能可以使用偏移纹理坐标的统一。
-
是的,正如我之前所说,硬件是用来清除屏幕并重新绘制所有内容的。
对于帧速率,您应该使用显示器的刷新率来避免垂直撕裂。现在几乎所有的显示器都是60Hz,所以60fps是最常见的"目标"帧速率。
选择30或60 fps,因为大多数现代显示器的刷新率为60 Hz。因此,每个"监视器帧"有2个或1个渲染帧。这样可以减少闪烁效果。(我不能100%确定你的意思是否是"闪光效果"。)
关于所有其他问题(听起来几乎相同):在OpenGL渲染中,重新绘制所有内容是非常常见的,因为在大多数游戏中,几乎整个屏幕在每一帧中都会发生变化,例如,如果你在四处移动。您可以进行部分屏幕更新,但这在CPU方面非常罕见,而且成本更高,因为您必须计算要绘制的部分,而不仅仅是"绘制所有内容"。
- 是
2-4.是的-希望这能帮助你理解为什么你必须。。。
想象一下你有两张纸。第一张纸上你画了一个站着不动的棍子人,并把它展示给别人。
在第二张纸上,当用户看着那张纸时,你又画了同样的东西,但这次你稍微移动了一下手臂。
现在你给他们看第二张纸,当他们看着第二张时,你清空第一张纸,画出那个人的手臂再动一点。
这就是它的工作原理,也是为什么无论什么都没有改变,都必须始终渲染整个图像的原因。
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 使用 GLUT 使用键停止动画?
- 是否可以配置提升日志刷新?
- 如何在qt中同步应用程序和显示器的刷新率?
- 使用对象数组对 SFML 进行动画处理
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- 如何减慢从 BVH 文件读取的 opengl 动画?
- 如何检测是否在缓冲绘画动画中绘制最后一帧?
- 从精灵表在 sfml 中为精灵制作动画
- 在 3ds Max 中更新进度条后,环境和效果 UI 不刷新
- std::endl,在 Python 中是否有等价物?(返回 + 刷新)
- Qt3D 骨骼动画
- ASCII 旋转光标 (TUI) 动画出现问题
- 带有 std::cout 的多线程控制台文本动画
- 有没有办法像动画一样移动控制台窗口?
- 在 directx11 代码中更改全屏模式下的刷新率不起作用
- 围绕特定轴对 qt3d 旋转进行动画处理
- 如何在Qt中设置围绕固定点的线的动画
- 试图用c++制作一个动画加载圈
- OpenGL 2D代理动画和场景刷新