Java LibGDX第一次加载scene2D小部件的速度非常慢,需要建议

Java LibGDX第一次加载scene2D小部件的速度非常慢,需要建议,java,android,menu,libgdx,scene2d,Java,Android,Menu,Libgdx,Scene2d,我开始在我的LibGDX游戏中使用scene2D来创建一个更专业的登录/注册菜单。唯一的问题是切换到这些菜单对于菜单导航来说非常长(3-5秒) 我想知道是否有更好的方法在手之前加载它们,比如在游戏的初始加载屏幕期间。问题是,一旦加载了其中一个菜单,第二次加载的速度就会非常快 我确信我的屏幕的create方法花费了这么长时间。以下是它正在加载的所有内容: public void create(){ stage = new Stage(new StretchViewport(1920, 10

我开始在我的LibGDX游戏中使用scene2D来创建一个更专业的登录/注册菜单。唯一的问题是切换到这些菜单对于菜单导航来说非常长(3-5秒)

我想知道是否有更好的方法在手之前加载它们,比如在游戏的初始加载屏幕期间。问题是,一旦加载了其中一个菜单,第二次加载的速度就会非常快

我确信我的屏幕的
create
方法花费了这么长时间。以下是它正在加载的所有内容:

public void create(){
    stage = new Stage(new StretchViewport(1920, 1080));
    Gdx.input.setInputProcessor(stage);
    loginBox = new Image(Textures.Gui.BOX);
    loginBox.setSize(650, 1000);
    loginBox.setPosition(635, 40);
    stage.addActor(loginBox);
    loginLBL = new Label("Login", Archipelo.SKIN, "basic-large-font", Color.LIGHT_GRAY);
    loginLBL.setPosition(880, 955); 
    stage.addActor(loginLBL);
    selectionHighlight = new Image(Textures.Gui.SELECTION_HIGHLIGHT);
    selectionHighlight.setSize(540, 140);
    stage.addActor(selectionHighlight);
    usernameTF = new TextField("", Archipelo.SKIN);
    usernameTF.setMaxLength(24);
    usernameTF.setPosition(usernameTFx, usernameTFy);
    usernameTF.setSize(400, 60);
    stage.addActor(usernameTF);
    passwordTF = new TextField("", Archipelo.SKIN);
    passwordTF.setPasswordMode(true);
    passwordTF.setPasswordCharacter('•');
    passwordTF.setPosition(passwordTFx, passwordTFy);
    passwordTF.setSize(400, 60);
    stage.addActor(passwordTF);
    usernameLBL = new Label("Username", Archipelo.SKIN, "basic-medium-font", new Color(1, 1, 1, 0.5f));
    usernameLBL.setPosition(usernameTFx + 10, usernameTFy + 5);
    stage.addActor(usernameLBL);
    passwordLBL = new Label("Password", Archipelo.SKIN, "basic-medium-font", new Color(1, 1, 1, 0.5f));
    passwordLBL.setPosition(passwordTFx + 10, passwordTFy + 5);
    stage.addActor(passwordLBL);
    remember = new CheckBox(" Remember Login?", Archipelo.SKIN);
    remember.setPosition(rememberX, rememberY);
    remember.getCells().get(0).size(30, 30);
    stage.addActor(remember);
    errorLBL = new Label("", Archipelo.SKIN, "basic-small-font", Color.RED);
    errorLBL.setPosition(750, 650);
    errorLBL.setWrap(true);
    errorLBL.setBounds(750, 500, 400, 250);
    stage.addActor(errorLBL);
    continueLBL = new Label("Continue", Archipelo.SKIN, "basic-big-font", Color.WHITE);
    continueLBL.setPosition(875, 100);
    stage.addActor(continueLBL);
}
此外,我在游戏的初始加载屏幕中加载uiskin文件
Archipelo.SKIN
是一个静态变量,它引用该uiskin。我还想提到我的screen类是定制的,无论何时调用
create()
,都是因为正在创建一个新的screen实例

我不明白的是,为什么第一次创建屏幕要花这么长时间,然后每隔一次,它仍然会经历相同的过程,只是速度要快得多。有没有办法让它第一次更快


提前谢谢。如果您需要更多信息,请询问。

以总结评论

OP有一个方便的纹理引用类,它列出了如下纹理:

public class Gui {

    public static final Texture BOX = new Texture("box.png");
    public static final Texture SELECTION_HIGHLIGHT= new Texture("selectionHighlight.png");
    //...

}
因为它们被声明为静态的,所以它们是类的成员,而不是类的实例。类的静态成员一次全部初始化,但仅在第一次访问该类或该类的实例时初始化。这种设置会导致所有Gui纹理在某个不合适的、计划外的时间一次全部加载

纹理的构造函数
纹理(字符串文件名)
导致从文件加载纹理,这非常耗时,因此加载Gui类需要几秒钟的时间


解决方案是不在成员纹理变量的声明中实例化它们。在某个方法中实例化它们,以便您可以准确地决定何时加载它们。

定义
纹理.Gui.BOX
的行是什么样子的?也许您无意中对纹理进行了某种延迟加载。确保在用户处于加载屏幕时提前加载纹理。它是一个650x1000像素的纹理。我试着用别针指出什么小部件需要很长时间才能加载,但我做不到。有时它是一个文本框,有时它是一个文本框和图像,甚至是一个标签。我还不太清楚。您是否将其定义为
公共静态纹理框并用一个方法加载,或者将其定义为
公共静态纹理框=新纹理(“texturefile.png”)还是别的?我有一个叫做
纹理的类。在那里我有子类,长方体纹理所在的子类是
Gui
子类(只是一种组织自己的方法)。因为您使用的是
final
,所以那里的所有纹理都是
public static final
,这是否意味着您正在声明中加载它们,如下所示:
public static Texture BOX=new Texture(“texturefile.png”)?这可以解释你的问题。Gui类的所有静态最终成员将仅在第一次访问任何一个成员时加载(这将触发Gui类的加载)。因此,当您第一次访问Gui中的任何内容时,它将突然初始化所有静态成员,因此如果您是这样排列它们的,应用程序将暂停以加载Gui中声明的所有纹理。