使用openGL渲染/动画2d的最佳方法?

时间:2012-03-19 07:22:27

标签: c++ opengl 2d

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

我现在正计划如何处理动画和优化渲染。我正在使用立即模式渲染,我被告知非常慢。我去寻找替代方案,然后有很多不同的方式,它根据你处理动画的方式而有所不同,所以我想我只想问什么是两者兼顾的最佳方法。

对于动画,我考虑过使用存储在内存中的图像序列,但只测试50个图像序列,内存跳到200 mb,之前是30。 (没有泄漏,它保持在200,但如果我有很大的水平,看起来我的内存已经不足了)。在这种情况下精灵表会有帮助吗?

我被告知使用地图集或精灵表的原因是因为绑定不同的纹理是一项昂贵的操作,所以唯一可行的方法是将所有纹理用于1级,例如在一个巨大的纹理中所以我只绑定一次。这是动态的吗?

使用一个巨大的PNG会比装载50个PNG更好地记忆吗?

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

2 个答案:

答案 0 :(得分:4)

使用VBO代替立即模式:http://www.opengl.org/wiki/Vertex_Buffer_Object

Sprite表有两个优点,首先,正如您所注意到的,您只需要绑定一个纹理。在内存方面,工作表仅为您提供连续内存(无碎片)的优势,但实际内存量不会少。加载一个大的.png在加载速度方面肯定会比50个较小的加快。您应该知道的一件事是,您可以在将图像上传到openGL纹理后释放图像的实际内存。否则你将它放在RAM和GPU内存中,这没有多大意义。

你可以做的另一件事是使用不同的动画技术,如关键帧或骨架动画(也是2D中的有效方法)来移动精灵,而不是为每个状态保存额外的图像/精灵。这肯定会大大减少GPU和RAM的内存使用量!

希望有所帮助!

答案 1 :(得分:4)

  

我被告知非常慢

我建议忽略这一点。除非你要使用疯狂数量的精灵(数万),否则你的瓶颈将是从纹理中读取数据,这受到显卡的内存传输速率的限制。换句话说,如果您有1280x1024视口,并且绘制了覆盖整个视口的1280x1024纹理(并且每个纹素映射到屏幕像素),您的FPS将会下降,VBO将无法提供帮助。对于2D而言,立即模式比VBO更容易使用。所以继续使用立即模式,直到你决定使用大量的精灵。

  

我考虑过使用存储在内存中的图像序列

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

  

使用一个巨大的PNG会比装载50个PNG更好地记忆吗?

存储在磁盘上的PNG图像文件格式。它与OpenGL无关。加载纹理后,它不再是“png” - 它完全解压缩。因此,如何将图像数据存储在磁盘上几乎无关紧要。它会影响图像加载速度,但纹理性能/内存使用与图像存储格式无关。如果你的内存不足,那么你将不得不做一些关于它的事情 - 实现游戏资产流,或调整关卡的精灵/纹理“预算”。