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

OpenGL/C++ Store all texture assets in a separate class as static members

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

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

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

我想创建一个单例 class (LevelsManager),其中包含一个包含所有纹理(位图)的静态成员数组。不过我觉得有点好笑...

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

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

您感觉到的卡顿可能是由您的硬盘驱动器引入的延迟引起的(开始加载第一个字节需要 20-30 毫秒,然后等待足够的时间来满足您的高清传输速率:100 Mb/s =>另外 0.1 秒是一堆帧,因此非常引人注目)。 (*)

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

可以使用缓冲区孤立或其他技术将内容流式传输到 OpenGL,但是如果您对 OpenGL 不满意,这会有点困难,而且无论如何,这比像往常一样加载它需要更多时间。

单例使用可能表明整体设计不佳。如果 class 需要 BackgroundTextureManager,您可以使用智能指针将其传递到 class 构造函数中。然而,对于一个非常小的游戏来说,它不会受到伤害,只要你知道单身人士通常很糟糕并且你是故意做坏事。

* 请注意,我加载了原始数据,实际上您可以使用 PNG 和 JPG 等压缩格式,这会增加额外的解码开销,解压缩部分仍应在第二个线程上完成。