Libgdx |在Thread中创建字体会导致黑色无纹理字体

时间:2016-09-01 01:27:49

标签: java android libgdx

当我尝试在libgdx线程中通过FreeTypeFontGenerator加载字体时,字体最终只是黑色(当没有加载到线程中时,它就好了)。我将在下面发布一张图片。我怎么能绕过这个?我希望它们与我的assetManager异步加载,但我不能用assetManager加载字体,因为它们必须动态创建。谢谢!如果有想要查看的代码,请告诉我。

enter image description here

1 个答案:

答案 0 :(得分:0)

这是OpenGL的一个限制,它是构建libgdx的基础。

在OpenGL中,必须在当前rendering context内加载(和释放)资产。要在不同的线程中加载资源(资产或字体),您需要明确地使上下文成为当前。

请参阅OpenGL and multithreading

  

我可以在与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内存(因此为黑色)。