2014-11-20 36 views
0

我开始在我的LibGDX游戏中使用scene2D来制作更专业的外观登录/注册菜单。唯一的问题是切换到这些菜单对菜单导航(3-5秒)非常长。LibGDX加载scene2D小部件第一次非常慢,需要建议

我想知道是否有更好的方法来加载它们,比如在游戏的初始加载屏幕中。事情是,一旦菜单中的一个被加载,第二次加载非常快。

我知道肯定它的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()时,都是因为正在创建一个新的屏幕实例。

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

在此先感谢。如果你需要更多的信息,所有的手段问。

+0

定义'Textures.Gui.BOX'的行是什么样的?也许你无意中做了一些延迟加载纹理。确保您的纹理在用户处于某个加载屏幕时提前加载。 – Tenfour04 2014-11-20 18:03:40

+0

这是一个650x1000像素的纹理。我试图指出小部件需要这么长时间才能加载,而我无法加载。有时它会是一个文本框和其他时间,它是图像,甚至是标签。这是相当随机的 – vedi0boy 2014-11-20 18:05:34

+0

仍然不清楚给我。你把它定义为'public static Texture BOX;'并且用一个方法加载它,或者你将它定义为'public static Texture BOX = new Texture(“texturefile.png”);'或者别的什么东西? – Tenfour04 2014-11-20 18:16:53

回答

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(String filename)会导致从文件加载纹理,这非常耗时,因此加载Gui类需要几秒钟的时间。

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