用Qt 4.5 / 4.6加载OpenGL螺纹瓷砖纹理

时间:2010-01-21 22:07:40

标签: qt opengl multithreading render tile

我正在尝试在我的大学开发用于科学目的的地图应用程序。因此我可以访问很多区块(256x256)。我可以访问它们并将它们保存到单独的QThread中的QImage中。我的问题是,我怎样才能真正设法将QImage加载到单独的QThread(而不是GUI主线程)中的纹理中?或者甚至更好地给我一个Tipp如何处理这个问题。

我虽然关于多线程OpenGL,但我也需要OpenGL挑选,但我并没有因此而有所帮助。#

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

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

感谢您的回复。 附:请耐心等待,因为这个主题可能(或可能不是)建议,我并不是那么高兴。

2 个答案:

答案 0 :(得分:2)

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

由于此处的瓶颈是图形卡的带宽,因此无法通过线程加速纹理加载。

让加载磁贴的传递线程填满一个环形缓冲区。 GL线程从环形缓冲区馈送。使用两个互斥锁可以很容易地控制环形缓冲区,从而实现线程安全操作。

这将是我的建议。

答案 1 :(得分:1)

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

  • 像素缓冲区对象:映射GPU内存,以便加载线程可以直接写入gpu;
  • 同步对象:使用同步对象我知道纹理何时可以使用(带有PBO的glTexImage2D是异步的,因此无法保证纹理已准备好绑定,即绑定纹理时,它会阻塞DMA没有完成更新纹理数据)