分离线程中的OpenGL加载资源

时间:2016-07-12 14:04:25

标签: multithreading opengl

我是多线程OpenGL的新手。我不想在分离的线程中使用共享上下文。我发现了一种可以映射内存以进行异步资源加载的方法。

但是我需要告诉glBufferData或glTexImage2D为我保留确切的内存大小。对于BMP,我们在标题中有信息。但要知道obj文件中顶点的数量,我们需要遍历整个文件......商业游戏引擎如何做到这一点?设计自己的格式?

1 个答案:

答案 0 :(得分:1)

以异步方式加载对我有用的资源的方法是将不可避免的读取文件操作推送到指定的线程中。它可以很容易地与懒惰的资源管理结合起来,如下所示:

  1. 设置场景,但不要立即从文件加载资源。而是将其标记为unitialized并存储文件路径以供以后使用。
  2. 开始渲染场景
  3. 一旦遇到标记为uninitialized的资源,就启动一个线程,将来自文件的数据异步加载到 CPU 缓冲区并存储元信息(例如纹理的宽度和高度) ,网格的顶点数等)。现在,通过某些默认值替换所请求的资源,或者简单地“#34;什么都不做”#34; (假设您的渲染器可以处理"清空"资源)。
  4. 在后续渲染步骤和资源请求中,检查关联的加载线程是否已完成,如果是,则创建必要的 GPU 缓冲区,上传数据并将资源标记为{{1 }}。存储的元数据可帮助您确定生成的缓冲区的必要大小。您现在可以按预期使用资源。
  5. 以这种方式处理资源可以避免在多个线程之间共享OpenGL上下文,因为您只是异步处理(可能是非常繁重的)CPU绑定的文件加载操作。当然,您必须应对互斥以安全地检查加载线程是否已完成。此外,您可以考虑定义和维护上传预算,以限制每帧从CPU传输到GPU的数据量,以避免帧速率下降。