我正在用 OpenGL、C++ 构建一个游戏,每个关卡都有不同的天空盒纹理,等等...
现在,我必须在级别变化时动态更改纹理,但我这样做时不会有任何延迟。
到目前为止,我将所有纹理保存在相应类的数组中,但是,现在,我意识到其他类有时需要相同的纹理并将它们保存(并首先再次加载)浪费和冗余。
我想创建一个单例类 (LevelsManager),其中包含一个包含所有纹理(位图)的静态成员数组。但是我觉得这样做有点好笑......
这是一个不好的做法吗,它是否有泄漏等问题...... 有没有更好的方法?
最佳答案
加载纹理(因此创建纹理所需的 GL 调用时间)不应以任何可见的方式卡住游戏。在我的旧笔记本电脑上加载一个 4 兆像素纹理(2048x2048 + 驱动程序端生成的 mipmap 级别)需要 10 毫秒,这远非引人注目(2Ghz cpu)。
您感觉到的卡顿可能是由您的硬盘驱动器引入的延迟引起的(20-30 毫秒开始加载第一个字节,然后等待足够的时间来满足您的高清传输速率:100 Mb/s => 另一个 0,1秒是一堆帧,因此非常引人注目)。 (*)
最好的办法是使用单独的线程在 RAM 内存中加载纹理,然后像往常一样将纹理加载到 OpenGL 中。
可以使用缓冲区孤立或其他技术将内容流式传输到 OpenGL,但是如果您对 OpenGL 不满意,这会有点困难,而且无论如何,这比像往常一样加载它需要更多时间。
单例使用可能表明整体设计不佳。如果一个类需要 BackgroundTextureManager
,您可以使用智能指针将其传递到类构造函数中。然而,对于一个非常小的游戏来说,这不会有什么坏处,只要您知道单例通常很糟糕并且您是故意做坏事。
* 请注意,我加载了原始数据,实际上您可以使用 PNG 和 JPG 等压缩格式,这会增加额外的解码开销,解压缩部分仍应在第二个线程上完成。
关于c++ - OpenGL/C++ 将所有纹理 Assets 作为静态成员存储在单独的类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31635678/