我是多线程OpenGL的新手。我不想在分离的线程中使用共享上下文。我发现了一种可以映射内存以进行异步资源加载的方法。
但是我需要告诉glBufferData或glTexImage2D为我保留确切的内存大小。对于BMP,我们在标题中有信息。但要知道obj文件中顶点的数量,我们需要遍历整个文件......商业游戏引擎如何做到这一点?设计自己的格式?
答案 0 :(得分:1)
以异步方式加载对我有用的资源的方法是将不可避免的读取文件操作推送到指定的线程中。它可以很容易地与懒惰的资源管理结合起来,如下所示:
unitialized
并存储文件路径以供以后使用。uninitialized
的资源,就启动一个线程,将来自文件的数据异步加载到 CPU 缓冲区并存储元信息(例如纹理的宽度和高度) ,网格的顶点数等)。现在,通过某些默认值替换所请求的资源,或者简单地“#34;什么都不做”#34; (假设您的渲染器可以处理"清空"资源)。以这种方式处理资源可以避免在多个线程之间共享OpenGL上下文,因为您只是异步处理(可能是非常繁重的)CPU绑定的文件加载操作。当然,您必须应对互斥以安全地检查加载线程是否已完成。此外,您可以考虑定义和维护上传预算,以限制每帧从CPU传输到GPU的数据量,以避免帧速率下降。