Multithreading 在当前线程中未找到OpenGL上下文

Multithreading 在当前线程中未找到OpenGL上下文,multithreading,opengl-es,opengl-es-2.0,libgdx,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

我正在使用LibGDX制作一个游戏。我希望根据需要动态加载/卸载资产。但是,等待在主线程中加载资产会导致延迟。为了解决这个问题,我创建了一个背景线程,它监视需要加载哪些资源(纹理、声音等),并适当地加载/卸载它们

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

com.badlogic.gdx.utils.GdxRuntimeException: java.lang.RuntimeException: No OpenGL context found in the current thread.
我尝试了
运行
在开始时在主线程中运行后台线程,只处理前几个屏幕,一切正常。我还可以改变算法,从一开始就在同一个线程中将所有内容加载到内存中,这同样有效。但是,在后台线程中两者都不起作用

当我在Android上使用OpenGL ES 2.0(这在某些方面很灵活)而不是在Windows上运行时,一切都运行良好,我甚至可以获得图像的像素尺寸-,但纹理呈现黑色


我的搜索结果告诉我,这是一个将OpenGL上下文绑定到单个线程的问题,而不是其他问题。这就解释了为什么当我把它放在主线程中时,一切都能正常工作,而当我把它放在另一个线程中时,一切都不能正常工作。如何解决此上下文问题?

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

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

如果你正在加载一吨的东西,你可能需要考虑创建一个加载条来加载任何大的东西。从另一个线程检查资产等可能会起作用(并设置一个标志来调用update),但在一天结束时,您将需要调用渲染线程

请记住,您必须从另一个线程调用update(),我不明白您为什么希望另一个线程检查条件并设置标志。使用另一个线程和同步update()调用可能比只在渲染线程上执行所有操作的开销更大。此外,update()方法在增量加载文件时一次只暂停几毫秒。通常,您只需调用资产,然后检查资产。如果未加载,则每帧调用一次update(),直到isLoaded()返回true。一旦返回true,您就可以调用并获取加载的任何资产。这一切都可以通过主渲染线程完成,而不会在加载应用程序时出现延迟


如果确实希望其他线程调用update(),则需要创建一个对象并进行调用,如在使用libGDX的on multi-threading中所述。但是,这就破坏了使用其他线程的全部意义,因为任何与postRunnable一起使用的东西都会在渲染线程上同步运行。

-1因为错误地声明OpenGL上下文而无法从多个线程中使用。从一个线程分离OpenGL上下文并将其附加到另一个线程是完全可能的。如何从多线程的意义上将上下文分离并附加到另一个线程?上下文本身一次只能由单个线程访问,除非您想尝试使用锁定来实现它。但是,这就违背了全部观点。您确实声称OpenGL上下文只能从渲染线程使用,这意味着只有创建上下文的线程才能使用它。顺便说一句:您可以使用共享对象名称空间在同一个drawable上创建多个OpenGL上下文,并将每个上下文附加到自己的线程。我明白你的意思,这是可能的,也有它的用途,但是对于libGDX的这个特殊问题,我不建议这样做。我会更新我的答案。