目前我正在第二个线程上将图像加载到内存中,然后在显示循环期间(如果需要纹理加载),加载纹理。
我发现我无法在第二个线程上加载纹理,因为 OpenGL 不喜欢这样;也许这是可能的,但我做错了什么 - 所以如果这实际上是可能的,请纠正我。
另一方面,如果我的失败是有效的——如何在不中断渲染循环的情况下加载纹理?目前,纹理从内存加载大约需要 1 秒,虽然这不是主要问题,但对用户来说可能会有点烦人。
您可以使用您希望读取文件的任何工具,在您喜欢的任何线程上将纹理从磁盘加载到内存。
但是,当您将其绑定到 OpenGL 时,需要在与该 OpenGL 上下文的渲染相同的线程上进行处理。话虽如此,这个讨论表明在第二个线程中使用 PBO 是一种选择,并且可以加快进程。
您当然可以在任意数量的线程中将纹理从磁盘加载到 RAM 中,但由于 Reed 的回答中提到的原因,OpenGL 不会在多个线程中上传到 VRAM。
鉴于从磁盘加载是最慢的部分,这就是您可能想要线程化的部分。加载线程建立一个要上传的纹理队列,然后这个队列被拥有 GL 上下文的线程消耗(但是请注意,您可以通过各种线程访问该队列)。您还可以考虑每帧上传 N 个纹理的非线程方法,其中 N 是一个不会过多减慢渲染速度的数字。