【问题标题】:Libgdx | Creating font in Thread causes black un-textured fontsLibgdx |在 Thread 中创建字体会导致黑色无纹理字体
【发布时间】:2016-09-01 01:27:48
【问题描述】:

当我尝试在 libgdx 线程中通过 FreeTypeFontGenerator 加载字体时,字体最终只是黑色(当未在线程中加载时,它很好)。我将在下面发布一张图片。我怎样才能解决这个问题?我希望它们与我的资产管理器异步加载,但我无法使用资产管理器加载字体,因为它们必须是动态创建的。谢谢!如果有你想看的代码,请告诉我。

【问题讨论】:

  • FreeTypeFontGenerator 不支持这个。有人更新它以将非 GL 内容拆分为单独的方法可能会很好,因此它可以分两个阶段完成,第一个阶段是异步的,第二个阶段在 GL 线程上同步。

标签: java android libgdx


【解决方案1】:

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

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

OpenGL and multithreading

我能否在与 OpenGL 上下文所在线程不同的线程中创建和处置资源?

如果您将上下文设置为当前(Windows 为 wglMakeCurrent)。但是,它并没有给你带来太多好处,如果有的话,所以不值得这么麻烦。

如果 GL 上下文在另一个线程上是当前的,建议您调用 wglMakeCurrent(NULL, NULL),然后在另一个线程中调用 wglMakeCurrent(dc, glrc)。

示例

线程_1:

wglMakeCurrent(NULL, NULL);
WaitForThread2(); OrDoSomeCPUJob();
wglMakeCurrent(dc, glrc);

线程_2:

wglMakeCurrent(dc, glrc);
DoSome_GL_Work();
wglMakeCurrent(NULL, NULL);
TerminateThread2_And_GiveControlToThread1();

AssetManager 的目的是在安全处理上述 OpenGL 上下文切换的同时进行异步加载。因此,与其将它们加载到手动创建的线程中,使用AssetManager 是一种更安全、更好的方法。

如果你必须使用手动线程,你还必须编写上面提到的手动开关。如果未完成,则加载的资源无法用于渲染,因为它们可能无法正确传输到 gpu 内存(因此为黑色)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多