我正在尝试使用 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