java - Android并发渲染器设计

标签 java android multithreading opengl-es rendering

我目前正在 Android 上编写一款游戏,其设计灵感来自 Replica Island 。即,一种双线程方法,一个逻辑线程和一个渲染线程。

我在逻辑线程中设置了一个轻量级渲染模块,它基本上只处理想要可渲染的游戏对象。它将渲染命令发送到渲染线程,例如“在 x,y 处渲染 Sprite f”。

我喜欢这个设计,但我目前的问题在于资源创建。假设 sprite f 需要一个纹理,它将在加载时在逻辑线程中请求该纹理。问题是,由于 OpenGL 上下文位于渲染线程中,因此纹理只能在渲染器线程中创建。目前,逻辑线程和渲染线程之间的唯一同步点是它们在帧末尾交换渲染队列时,我希望保持这种状态。

如何解决想要在逻辑线程上创建纹理、vbo 等的问题,同时仍然只在渲染线程上渲染内容?共享 OpenGL 上下文是一个好方法吗?或者可能是引擎的其他设计?

编辑:一种替代方案是使用另一个队列,您可以在其中放置来自逻辑线程的请求。就像“创建纹理”等。渲染线程将迭代此队列并在开始渲染另一个队列之前对其进行处理。我开始喜欢这个解决方案。

最佳答案

OpenGL 要求从渲染线程调用 glBindTexture。我强烈建议您从 GLSurfaceView.Renderer onSurfaceCreated 方法(由渲染线程调用)进行绑定(bind)。如果重新创建 GL 上下文,将再次调用此函数以重新绑定(bind)所有内容。

如果您选择从另一个线程驱动它,请通过在 GLSurfaceView 对象上调用queueEvent 向渲染线程传递一个可运行对象。请注意尚未调用 onSurfaceCreated 的竞争。

祝您游戏愉快!

关于java - Android并发渲染器设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4296828/

相关文章:

java - Android、Java 上的单选按钮列表

r - 在 R( future )中进行多处理时如何避免填充 RAM?

multithreading - 互斥锁有什么作用?

java - 是否总是需要一个单独的 "writer"线程(在套接字读取器/文件写入器客户端中)?

Ubuntu 中的 Java 打印

java - 并发和 CacheLoader.load()

java - 在 Swing JFrame 上添加 WebView 控件

java - 我正在尝试使用 aop 切入点进行交易,但出现错误我也在使用 hibernate

android - 通过 App Engine 登录 Facebook

android fragment webview加载指示器