c++ - 使用 openGL 渲染/动画 2d 的最佳方式?

标签 c++ opengl 2d

<分区>

所以我正在用 C++ 制作游戏。我正处在岔路口。

我现在正在计划如何处理动画和优化渲染。我正在使用即时模式进行渲染,有人告诉我速度很慢。我一直在寻找替代方案,然后发现了很多不同的方法,并且根据您处理动画的方式而有所不同,所以我想我只想问一下什么是兼顾两者的最佳方法。

对于动画,我考虑过使用存储在内存中的图像序列,但只测试了 50 个图像序列,内存猛增到 200 MB,而之前是 30 个。 (没有泄漏,它保持在 200,但如果我有大级别,看起来我将耗尽内存)。 Sprite 表在这种情况下会有帮助吗?

我被告知使用 map 集或 Sprite 表的原因是因为绑定(bind)不同的纹理是一项昂贵的操作,所以唯一可行的方法是将我将用于 1 级的所有纹理放入一个巨大的纹理中所以我只绑定(bind)一次。这可能是动态的吗?

使用一个巨大的 PNG 是否比加载 50 个 PNG 在内存方面更好?

非常感谢任何有关优化渲染的帮助或有关这些动画技术的缺点的一些信息!

最佳答案

I was told was very slow

我建议忽略这一点。除非你打算使用疯狂数量的 Sprite (数万),否则你的瓶颈将是从纹理中读取数据,这受到视频卡内存传输速率的限制。换句话说,如果您有 1280x1024 视口(viewport)并且绘制覆盖整个视口(viewport)的 1280x1024 纹理(并且每个纹素映射到屏幕像素),您的 FPS 将会下降并且 VBO 将无济于事。即时模式也比 VBO 更容易用于 2D。因此,请继续使用即时模式,直到您决定使用大量 Sprite 。

I thought about using sequences of images stored in memory

您需要将尽可能多的 Sprite 塞入单个纹理中。切换纹理会产生很大的减速,所以最好的办法是使用巨大的纹理(4096x4096 或更大 - 16384x16384 会很好)并加载所有 Sprite 。这可以使用 glSubTexImage2D 来完成。存储每一帧单独的纹理会产生巨大的减速。请注意,您不必将 Sprite 存储在磁盘上并合并为单个纹理。您可以在加载时将它们粘在一起。

Would using one gigantic PNG be better memory-wise than loading 50 PNG's?

存储在磁盘上的 PNG 图像文件格式。它与 OpenGL 无关。加载纹理后,它不再是“png”——它已完全解压缩。因此,如何将图像数据存储在磁盘上几乎无关紧要。它会影响图像加载速度,但纹理性能/内存使用与图像存储格式无关。如果您的内存不足,那么您必须采取一些措施 - 实现游戏 Assets 流,或调整关卡的 Sprite /纹理“预算”。

关于c++ - 使用 openGL 渲染/动画 2d 的最佳方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9766390/

相关文章:

c++ - 设置GL_TEXTURE_2D_ARRAY,帧缓冲区不完整

c++ - 二维碰撞 react

c++ - Qt 5 的多个 OpenGL 视口(viewport)

c - 二维数组地址簿存在 fgets 问题

java - 这个自定义 "path finding"算法有什么问题?

c++ - 如何避免服务器的多个线程向客户端发送数据的竞争条件? C++

c++ - 在 C++ 中将字符转换为整数

c++ - c++中如何计算float数据类型的范围?

c++ - 为什么我们在 pthread_create 中将函数参数作为 void* 传递?