当前线程中找不到OpenGL上下文

Gra*_*her 8 multithreading opengl-es opengl-es-2.0 libgdx

我正在使用LibGDX来制作游戏.我想根据需要同时加载/卸载资产.但是,等待资源加载到主线程中会导致延迟.为了解决这个问题,我创建了一个后台线程来监视需要加载哪些资产(纹理,声音等)并适当地加载/卸载它们.

不幸的是,AssetManager.update()从该线程调用时出现以下错误.

com.badlogic.gdx.utils.GdxRuntimeException: java.lang.RuntimeException: No OpenGL context found in the current thread.
Run Code Online (Sandbox Code Playgroud)

我在开始时尝试run在主线程中使用后台线程,只处理前几个屏幕,一切正常.我也可以改变算法,从一开始就在同一个线程中将所有内容加载到内存中,这也是有效的.但是,它们都不适用于后台线程.

当我在Android上使用OpenGL ES 2.0(在奇怪方面灵活)而不是在Windows上运行它时,一切运行正常,我甚至可以获得图像的像素尺寸 - 但纹理呈现黑色.

我的搜索告诉我,这是OpenGL上下文绑定到单个线程的问题,但不是很多.这解释了为什么当我把它推到主线程中时一切都有效,而不是当我把它放在另一个线程中时.如何解决此上下文问题?

Jyr*_*117 9

首先,您不应该在渲染线程之外访问OpenGL上下文.

我假设你已经看过这些,但只是为了确保阅读AssetManager wiki文章,该文章讨论了如何使用AssetManager进行异步资产管理.除了wiki文章,请查看AssetManagerTest以更好地了解如何使用它.资产管理器测试可能是加载如何动态加载资产的最佳选择.

如果你要加载大量的东西,你可能想要创建一个加载栏来加载任何大的东西.它可能会从另一个线程检查资产等(并设置一个标志来调用更新),但在一天结束时,您需要在呈现线程上调用update().

记住你必须从另一个线程调用update()它,我不明白为什么你想要另一个线程检查条件并设置一个标志.使用另一个线程并同步update()调用可能比在渲染线程上执行所有操作更多.此外,update()方法在逐步加载文件时一次只能暂停几毫秒.通常,您只需为资产调用load(),然后在资产上检查isLoaded().如果未加载,则每帧调用update()一次,直到isLoaded()返回true.一旦它返回true,你就可以调用get()并获取你正在加载的任何资产.这可以通过主渲染线程完成,而不会在加载时出现app滞后.

如果你真的希望你的其他线程调用update(),你需要创建一个Runnable对象并调用postRunnable(),例如他们如何在使用libGDX的多线程的wiki文章中描述它.但是,这会破坏使用其他线程的全部意义,因为与postRunnable一起使用的任何内容都会在呈现线程上同步运行.