2012-03-19 80 views
4

所以我用C++制作游戏。我正在路上岔路口。使用openGL渲染/动画2d的最佳方式?

我现在打算我会如何处理动画和渲染优化。我使用即时模式进行渲染,我被告知速度很慢。我去寻找替代品,然后有很多不同的方法,它取决于你如何处理动画,所以我想我会问什么是一个很好的最佳方式来做到这一点。

对于动画,我考虑使用存储在存储器中的图像的序列,而只用一个50个图像序列进行测试时,存储器跃升至喜欢200 MB,当它之前为30。 (没有泄漏,它保持在200,但如果我有很大的水平,看起来我会用完内存)。精灵表会在这种情况下帮助吗?

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

将一个巨大的PNG比装载50 PNG的更好的内存明智?

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

回答

4

有人告诉我是非常缓慢的

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

我想过使用存储在内存中

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

使用一个巨大的PNG会比加载50个PNG更好的记忆方式吗?存储在磁盘上

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

+1

谢谢你的帮助!很高兴知道我不必将我的渲染技术转到VBO。关于PNG部分,这很好理解!但是我实际上只是指加载1个更好的图片比加载50个更小的图片并将它们保存在内存中更好,但我猜两者都会在内存中占用相同的空间量? – 2012-03-21 03:17:34

4

使用VBO的,而不是直接的方式:http://www.opengl.org/wiki/Vertex_Buffer_Object

雪碧床单有两个好处,首先,当你发现,你只需要一个纹理绑定。就内存而言,工作表只会给你内存连续的优点(无碎片),但实际的内存量不会少。加载一个大.png的速度肯定比加载速度快50个小。有一件事你应该知道的是,你可以在将图像上传到openGL纹理后释放图像的实际内存。否则,你有它在RAM和GPU内存,这没有多大意义。

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

希望有帮助!

+0

谢谢你的解释!这真的有点亮。 – 2012-03-21 03:18:00