与android GLES glBufferData并发

时间:2013-06-12 16:11:20

标签: android opengl-es landscape

我正在尝试使用Android和OpenGL 2.0来创建一种沙漠赛车游戏。至少那是最终目标。暂时我只是通过使用Perlin噪声算法来创造无尽的沙漠。但是,我遇到了很多关于并发和同步的问题。该程序由三个线程组成:一个“渲染”线程,一个“几何”线程,它基本上位于后台生成perlin噪声的瓦片(最终将它们发送到渲染线程以在其自己的时间处理)和一个“主”如果需要创建新的perlin噪声切片,则更新相机位置并更新几何线程的线程。

前面提到的perlin瓷砖存储在VBO中,只有当它们在相机的一定距离内时才会被渲染。缓冲区初始化总是立即开始。

这一切都运作良好,没有任何明显的问题。

但是。

当通过glBufferData()将切片上传到GPU时(在单独的几何线程处理之后),渲染线程总是显示为阻塞。我认为这是因为Android在呈现屏幕缓冲区之前隐式调用glFinish()。显然,我希望数据上传在后台执行,而其他所有内容都被绘制 - 如果需要,甚至可以在多个帧上进行。

我看过谷歌,我能找到的唯一解决方案是使用glMapBuffer / glMapBufferRange(),但GLES2.0不支持这两种方法。也没有任何同步对象 - glFenceSync等等......

...

任何帮助?

P.S。我没有提供任何代码,因为我认为没有必要,因为这个问题对我来说似乎更具理论性。但是我当然可以根据要求制作一些。

目前为止的游戏截图: http://i.stack.imgur.com/Q6S0k.png

1 个答案:

答案 0 :(得分:0)

Android不会调用glFinish()(glFinish()实际上是IMG GPU上的无操作)。问题是glBufferData()不是异步API。您真正想要的是仅在OpenGL ES 3.0中可用的PBO,并且提供执行异步复制(包括纹理上载)的能力。

你总是使用glBufferData()吗?你应该尽可能多地使用glBufferSubData()来避免每次都重新分配你的VBO。