Java ExceptionInInitializeError与libGDX中的枚举

Java ExceptionInInitializeError与libGDX中的枚举,java,opengl,exception,enums,libgdx,Java,Opengl,Exception,Enums,Libgdx,我有以下enum文件开发卡类型: enum DevelopmentCardType { KNIGHT (0, new Texture(Gdx.files.internal("knight_card.png"))); VICTORY_POINT (1, new Texture(Gdx.files.internal("victory_point_card.png"))), private final Texture cardTexture; private fina

我有以下enum文件开发卡类型:

enum DevelopmentCardType {
    KNIGHT (0, new Texture(Gdx.files.internal("knight_card.png")));
    VICTORY_POINT (1, new Texture(Gdx.files.internal("victory_point_card.png"))),

    private final Texture cardTexture;
    private final int type;
    private static final List<DevelopmentCardType> VALUES = Collections.unmodifiableList(Arrays.asList(values()));

    DevelopmentCardType(int type, Texture cardTexture) {
        this.type = type;
        this.cardTexture = cardTexture;
    }

    public Texture getCardTexture() {
        return cardTexture;
    }

    public static List<DevelopmentCardType> getVALUES() {
        return VALUES;
    }
}
创建新的开发卡时,它会创建一个ExceptionInInitializerRor,这是由于没有OpenGL上下文造成的

这意味着枚举中使用的纹理尚未创建,因此,在套接字事件中首次使用枚举之前,我希望先创建纹理。我可以通过向DevelopmentCardType类添加一个init方法来解决这个问题,正如我所理解的那样,在enum中调用任何可能是空的方法(如仍然在OpenGL上下文中的方法)都可以解决这个问题,我不确定这样做是否正确:

static void init() {}
并在Main类中调用它,如DevelopmentCardType.init


这是解决这个问题的正确方法吗?我还可以通过在OpenGL环境中创建开发卡来解决这个问题,之后,创建新的开发卡实例不会导致错误。

实例化纹理有两个要求。它必须在GL线程上完成,并且必须在初始化LibGDX之后完成

第一次在任何地方引用DevelopmentCardType时,它将实例化其所有值KNIGHT和VICTORY_POINT。这很可能发生在Gdx引擎初始化之前,当您在DesktopLauncher或AndroidLauncher中调用initialize时会发生这种情况。如果DevelopmentCardType在create和render方法之外的任何地方使用,例如在构造函数中,或者作为成员变量,则它也可能发生在与GL线程不同的线程中

此外,枚举处理纹理资源的加载是没有意义的,纹理是瞬态对象,如果处理不当会导致内存泄漏


实际上,您应该在一个地方处理游戏的所有资产,以便轻松管理加载和卸载,并避免内存泄漏。LibGDX已经有了一个强大的类来实现这一点,AssetManager。如果希望保持与当前代码类似的结构,我建议使用纹理文件名的字符串替换枚举的纹理成员。这可用于从AssetManager检索纹理。您可以将AssetManager实例传递给DevelopmentCard构造函数,这样它就可以检索纹理。

我会看看我是否理解AssetManager,我会回到这个答案。所以我必须通过许多构造函数传递AssetManager实例,并传递给DevelopmentCard和其他类的所有实例?这不是很慢吗?或者这就是你的意思?我已经实现了AssetManager,使用的ram减少了一半,现在我不需要调用方法就可以使用它。谢谢您:
static void init() {}