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

时间:2014-11-20 17:59:06

标签: java android menu libgdx scene2d

我开始在我的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。我还想提一下我的屏幕类是自定义的,每当调用create()时,都是因为正在创建一个新的屏幕实例。

我不能得到的是为什么第一次创建屏幕需要这么长时间然后每隔一段时间,它仍然会经历相同的过程,除非它更快。有没有办法让它第一次变快?

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

1 个答案:

答案 0 :(得分:1)

总结评论......

OP有一个纹理引用的便利类,它列出了这样的纹理:

public class Gui {

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

}

由于它们被声明为static,因此它们是类的成员,而不是类的实例。类的静态成员都是一次初始化的,但只是第一次访问类或类的实例。这种设置导致所有Gui纹理在一些不合时宜的,无计划的时间内被一次性加载。

Texture&#39>构造函数Texture(String filename)导致从文件加载纹理,这非常耗时,因此加载Gui类需要几秒钟。

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