2

我正在尝试在我的大学开发用于科学目的的地图应用程序。因此,我可以访问很多瓷砖(256x256)。我可以访问它们并将它们保存到单独的 QThread 中的 QImage 中。我的问题是,我如何才能将 QImage 加载到单独的 QThread (不是 GUI 主线程)中的纹理中?或者更好地给我一个提示如何解决这个问题。

我虽然关于多线程 OpenGL,但我也需要选择 OpenGL,而且我没有遇到任何有用的东西。#

如果您愿意,请向我指出任何有用的示例代码,我很感谢在 Linux 上编译的所有内容 :)

注意1:我使用的是基于事件的渲染,所以只有当场景发生变化时才会重绘。注意 2:OSG 不是一个选项,为此目的它太重了,需要一种轻量级的方法。注3:应用程序完全用 C++ 编写

感谢您的回复。PS请耐心等待,我并不像本主题可能(或可能不会)建议的那样先进。

4

2 回答 2

2

OpenGL 不是线程安全的。您一次只能在一个线程中使用一个 GL 上下文。根据操作系统,您还必须明确放弃一个线程中的上下文句柄才能在另一个线程中使用它。

鉴于这里的瓶颈是显卡的带宽,您无法通过线程加速纹理加载。

让加载切片的交付线程填满环形缓冲区。GL 线程从环形缓冲区提供数据。使用两个互斥锁很容易控制环形缓冲区以进行线程安全操作。

那将是我的建议。

于 2010-01-21T22:18:11.543 回答
1

我用来加快速度的两个技巧:

  • 像素缓冲区对象:映射 GPU 内存,以便加载线程可以直接写入 gpu;
  • 同步对象:使用同步对象,我知道纹理何时真正准备好使用(glTexImage2D 与 PBO 是异步的,因此不能保证纹理已准备好绑定,即在绑定纹理时,如果 DMA 没有,它会阻塞' t 完成更新纹理数据)
于 2011-05-16T18:04:44.693 回答