Java ExceptionInInitializeError与libGDX中的枚举
我有以下enum文件开发卡类型: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 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() {}