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

标签 c++ opengl static textures game-engine

我正在用 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/

相关文章:

java - 想要静态但不能支持?

c++ - std::ofstream - 没有超过 1023 的缓冲字符串(即时刷新)

c++ - 不使用标识符重复类实例化

c++ - 将 K String 映射到字符串的最佳方法?

opengl - OpenGL 中的 Z 深度测试

c++ - Qt QPainter在paintEvent中消除用paintGL绘制的图形

c++ - 如何尽快交换缓冲区

java - final关键字可以单独用于在java中定义常量吗

java - 如何初始化最终对象数组

c++ - 跨平台分发 Qt/C++ 应用程序