OpenGL / C ++将所有纹理资源作为静态成员存储在单独的类中

时间:2015-07-26 09:57:22

标签: c++ opengl static textures game-engine

我正在用OpenGL,C ++构建游戏,每个级别都有不同的天空盒纹理等等......

现在,我必须在级别更改时动态更改纹理,但是当我这样做时不会有任何延迟。

到目前为止,我在相应的类中保存了数组中的所有纹理,但是,现在,我意识到其他类,有时需要相同的纹理并保持它们(并在第一时间再次加载)浪费和冗余。

我曾想过用一个包含所有纹理(位图)的静态成员数组创建一个单例类(LevelsManager)。然而,我觉得这样做很有趣......

这是一种不好的做法,它是否有泄漏等问题...... 有没有更好的方法?

1 个答案:

答案 0 :(得分:1)

加载纹理(因此创建纹理所需的GL调用时间)不应以任何可见的方式冻结游戏。在我的旧笔记本电脑上加载一个4百万像素的纹理(2048x2048 +驱动程序生成的mipmap级别)需要10毫秒,这远远不是明显的(2Ghz cpu)。

您感觉冻结可能是由硬盘驱动器引入的延迟造成的(20-30毫秒开始加载第一个字节,然后等待足够的时间来满足您的HD传输速率:100 Mb / s =>另一个0, 1秒钟是一堆帧,因此非常明显)。 (*)

最好的办法是使用单独的线程在RAM内存中加载纹理,然后像往常一样将纹理加载到OpenGL中。

可以使用缓冲区孤立或其他技术将内容流式传输到OpenGL,但是如果您对OpenGL感觉不舒服,那就有点困难,无论如何这需要比平时更多的时间来加载它。

单身使用可能表示整体设计不佳。如果一个类需要BackgroundTextureManager,你可以使用智能指针在类构造函数中传递它。然而,对于一个非常小的游戏,它不会受到伤害,只要你知道单身人士一般都很糟糕而且你的意图是做坏事。

* 请注意,我加载了原始数据,实际上你可能有像PNG和JPG这样的压缩格式,这会增加额外的解码开销,解压缩部分应该在第二个线程上完成。