【发布时间】:2017-05-29 09:58:12
【问题描述】:
我制作了一个相对简单的结构化 Android 游戏,它可以很容易地在 GLSurfaceView 的渲染线程中的 onDrawFrame 函数中更新游戏逻辑和进行渲染。但是,考虑到未来的项目,我已经开始探索多线程选项,包括在渲染线程之外运行主游戏更新逻辑,这就是副本岛所做的。这里有一篇关于它的博文:http://replicaisland.blogspot.co.nz/2009/10/rendering-with-two-threads.html
副本岛源代码 (https://code.google.com/archive/p/replicaisland/source) 等资源有助于理解这种双缓冲渲染-命令-注册多线程渲染器的想法。游戏循环更新对象,并且那些想要被绘制的对象在当前未使用的缓冲区中注册。该缓冲区在某个时候被交换,渲染器处理这些渲染命令以使用 opengl 绘制它们。
有些事情我还没有真正理解。
副本岛游戏线程循环(GameThread.java)以等待渲染器停止渲染的块开始(mRenderer.waitDrawingComplete)。然后它更新游戏逻辑,然后交换缓冲区。交换缓冲区通知渲染器开始下一批。渲染器完成后,游戏循环将再次更新,依此类推。 这种方法似乎没有运行游戏逻辑和并行循环渲染对象的代码?它们似乎步调一致地运行,并且在 onDrawFrame 函数完成后 opengl 实际完成渲染时,游戏逻辑不必阻塞,从而获得性能提升。
我测试了类似的代码,当需要绘制大量内容时,这绝对比单线程更快。但是,由于渲染循环不会在游戏线程也在处理对象时循环对象,因此似乎没有任何内在需要拥有多个渲染命令缓冲区。据我所知(我猜我在某处弄错了)游戏更新实际上并没有在渲染器使用第一个缓冲区时更新第二个缓冲区。如果是这样,那为什么还要有两个缓冲区呢?
为什么游戏线程在更新之前要等待渲染器停止绘制?
【问题讨论】:
标签: java android multithreading opengl-es renderer