1

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

上述 perlin 瓦片存储在 VBO 中,并且仅在它们位于相机一定距离内时才会渲染。缓冲区初始化总是立即开始。

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

然而。

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

我在 google 上查看过,我能找到的唯一解决方案是使用 glMapBuffer/glMapBufferRange(),但是 GLES2.0 不支持这两种方法。任何同步对象都不是 - glFenceSync 等,所以......

……

有什么帮助吗?

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

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

4

1 回答 1

0

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

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

于 2013-06-12T17:38:36.463 回答