libgdx为什么切换屏幕时我的游戏停滞

时间:2018-12-01 14:30:37

标签: android performance libgdx loading lag

当我切换屏幕时,它会滞后并且需要很长时间才能将其加载到android上,但是在桌面启动器上,它会立即加载它。

需要长时间加载的屏幕示例是水平屏幕,它从主菜单转到那里。

这是LevelScreen中的代码,需要很长时间才能加载,这有什么原因吗?

public class LevelScreen extends MenuBase {


private GameMain mGameMain;


public LevelScreen(GameMain main) {
    super(main, GameInfo.LEVEL_SCREEN_NAME);

    this.mGameMain = main;

    main.ply.showAds(false);
}

@Override
protected Actor createActors() {

    Table container = new Table();
    container.setDebug(GameInfo.TABLE_DEBUG);
    container.setFillParent(true);
    container.setBackground(new TextureRegionDrawable(new TextureRegion(new Texture(AssetPaths.BLUE_BACKGROUND))));

    Table table = new Table();
    table.setBackground(new TextureRegionDrawable(new TextureRegion(new Texture(AssetPaths.BLUE_BACKGROUND))));
    table.setDebug(GameInfo.TABLE_DEBUG);


    final ScrollPane scroll = new ScrollPane(table, uiSkin);


    table.pad(GameInfo.HUD_HEIGHT).defaults().space(10);


    for (int i = 1; i < 8; i++) {

        table.row();

        final TextButton button = new TextButton("Level  " + i, uiSkin, SkinStylePath.LIGHT_BUTTON_LONG);

        table.add(button).padRight(50f);
        button.addListener(new ClickListener() {
            public void clicked(InputEvent event, float x, float y) {
                System.out.println("click " + x + ", " + y);
            }
        });

        System.out.println(GameManager.getInstance().scoreUnlockList(i));


        System.out.println("GameManager.getInstance().mGameData.getUpToWhichLevelIsUnlocked() = " + GameManager.getInstance().mGameData.getUpToWhichLevelIsUnlocked() +
                "\n GameManager.getInstance().mGameData.isLevel7Unlocked() " + GameManager.getInstance().mGameData.isLevel7Unlocked());


        if (GameManager.getInstance().mGameData.getUpToWhichLevelIsUnlocked() < i) {
            // for the levels we haven't unlocked write this next to it.
            table.add(new Label("get over " + GameManager.getInstance().scoreUnlockList(i) + " points to unlock this level", uiSkin, SkinStylePath.ARVO_WHITE_WITH_BLACK_OUTLINE_22));
            //disable all the buttons that we haven't unlocked that level for
            button.setDisabled(true);
        }


        final int finalI = i;
        button.addListener(new ChangeListener() {
            @Override
            public void changed(ChangeEvent event, Actor actor) {
                clickSound(randomNumberGenerator()).play(GameManager.getInstance().mGameData.getSoundFxVolume());
                playLevel(finalI, button);
            }
        });


    }


    scroll.setFlickScroll(true);
    scroll.setFadeScrollBars(true);
    scroll.setSmoothScrolling(true);


    container.add(scroll).expand().fill();
    container.row();


    return container;
}

@Override
protected void createAnotherActor(Stage mStage) {
    Texture handTexture;
    handTexture = mAssetManager.get(AssetDescriptors.HAND);
    Image handImage = new Image(handTexture);
    handImage.setPosition(560, 100);

    SequenceAction sequenceAction = new SequenceAction(GameManager.getInstance().handMoveSequence(0.3f, false), Actions.moveTo(560f, 560f, 0.8f));
    handImage.addAction(sequenceAction);


    if (GameManager.getInstance().mGameData.getUpToWhichLevelIsUnlocked() >= 3) {
        mStage.addActor(handImage);
    }

}


void playLevel(int levelNumber, TextButton levelTextButton) {
    GameManager.getInstance().selectLevel(levelNumber);

    mGameMain.setScreen(new NutritionQuiz(mGameMain, levelTextButton.getText().toString()));
}


@Override
public void show() {

}


}

2 个答案:

答案 0 :(得分:0)

我能做的只是猜测是什么在减缓您的游戏速度。

我首先看到的是container.setBackground(new TextureRegionDrawable(new TextureRegion(new Texture(AssetPaths.BLUE_BACKGROUND))));,每次切换屏幕时都会调用此方法。该行中花费时间最长的事物可能是new Texture(AssetPaths.BLUE_BACKGROUND)。这样做比拥有静态资源要好得多,但需要很长时间。

您可以做的一件事是使用Skin。这是libgdx整理子画面,字体和几乎所有其他东西的方式。很难重构代码以使其使用皮肤,但最终还是值得的。如果使用正确,则所有的Sprite都将被编译成一个主文件之类的文件,而不是包含多个Sprite的文件,因此仅需加载一个文件。

这里是example of how I use it。如您所见,我有一个skin.atlas,skin.json,skin.png。幸运的是,您不必手动创建它们。 How to use TexturePacker也很有用。

如果您真的不想将游戏重构为使用外观,则始终可以将Drawables存储在单个对象中,并将该对象传递给每个Screen,这样每当屏幕更改时它就不会加载精灵。

答案 1 :(得分:0)

请提供MenuBase的代码,因为无法从继承的类中看到某些内容。

可能发现缺乏性能的解决方案:

1)尝试逐步分析您的代码。创建任何时间计数器类,并在调用下一屏后检查您调用的每个方法。

2)尝试从受影响的类中删除所有其他代码。如果您有演员创建方法-不要调用它。您有main.ply.showAds(false);-首先尝试删除它,我想这段代码会调用外部库中的某些内容。很容易就能降低您的应用速度。

对于@retodaredevil答案-new TextureTextureRegion等方法不会使事情变糟。我有成百上千个这样的方法调用的接口,我认为这样做不会对加载时间产生任何影响。

相关问题