当我尝试在libgdx线程中通过FreeTypeFontGenerator加载字体时,字体最终只是黑色(当没有加载到线程中时,它就好了)。我将在下面发布一张图片。我怎么能绕过这个?我希望它们与我的assetManager异步加载,但我不能用assetManager加载字体,因为它们必须动态创建。谢谢!如果有想要查看的代码,请告诉我。
答案 0 :(得分:0)
这是OpenGL的一个限制,它是构建libgdx的基础。
在OpenGL中,必须在当前rendering context内加载(和释放)资产。要在不同的线程中加载资源(资产或字体),您需要明确地使上下文成为当前。
我可以在与OpenGL上下文不同的线程中创建和处理资源吗?
如果使上下文成为当前(Windows的wglMakeCurrent)。但是,如果有的话,它不会给你带来太大的收益,所以这不值得麻烦。
如果GL上下文在另一个线程上是最新的,建议你调用wglMakeCurrent(NULL,NULL),然后在另一个线程中调用wglMakeCurrent(dc,glrc)。
示例强>
Thread_1:
wglMakeCurrent(NULL, NULL);
WaitForThread2(); OrDoSomeCPUJob();
wglMakeCurrent(dc, glrc);
Thread_2:
wglMakeCurrent(dc, glrc);
DoSome_GL_Work();
wglMakeCurrent(NULL, NULL);
TerminateThread2_And_GiveControlToThread1();
AssetManager
的目的是在安全地处理上述OpenGL上下文切换时异步加载。因此,使用AssetManager
而不是在手动创建的线程中加载它们是一种更安全,更好的方法。
如果你必须使用手动线程,你还必须编写上面提到的手动开关。如果没有完成,则加载的资源不可用于渲染,因为它们可能无法正确传输到gpu内存(因此为黑色)。