libgdx почему моя игра зависает при переключении экранов - PullRequest
0 голосов
/ 01 декабря 2018

Когда я переключаю экраны, он отстает и требует очень много времени, чтобы загрузить его на 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 голосов
/ 03 декабря 2018

Пожалуйста, предоставьте код MenuBase, потому что невозможно увидеть что-то из вашего унаследованного класса.

Возможные решения, чтобы найти недостаток производительности:

1) Попробуйте профилировать ваш шаг кодашаг за шагомСоздайте любой класс счетчика времени и проверьте каждый метод, который вы вызываете после вызова следующего экрана.

2) Попробуйте удалить весь дополнительный код из ваших затронутых классов.Если у вас есть актеры, создайте метод - не называйте егоУ вас main.ply.showAds(false); - попробуйте сначала удалить его, я думаю, этот код вызывает что-то из внешней библиотекиЭто легко может замедлить ваше приложение.

Что касается ответа @retodaredevil - такие методы, как new Texture, TextureRegion и т. Д., Не делают ничего плохого.У меня есть интерфейс с сотнями таких вызовов методов, и я не вижу никакого влияния на время загрузки.

0 голосов
/ 02 декабря 2018

Все, что я могу сделать, это угадать, что замедляет вашу игру.

Первое, что я вижу, это container.setBackground(new TextureRegionDrawable(new TextureRegion(new Texture(AssetPaths.BLUE_BACKGROUND)))); Каждый раз, когда вы переключаете экраны, вызывается этот метод.Самое длинное в этой линии, вероятно, new Texture(AssetPaths.BLUE_BACKGROUND).Делать это гораздо лучше, чем иметь статические ресурсы, но это занимает много времени.

Одна вещь, которую вы можете сделать, это использовать Скин .Это способ, которым libgdx организует спрайты, шрифты и почти все остальное.Реорганизовать код, чтобы он использовал скин, может быть сложно, но, в конце концов, оно того стоит.При правильном использовании вместо нескольких файлов со спрайтами все спрайты будут скомпилированы в файл типа master, поэтому должен быть загружен только один файл.

Вот пример того, как я его использую.Как видите, у меня есть skin.atlas, skin.json, skin.png.К счастью для вас, вам не нужно создавать их вручную. Как использовать TexturePacker Также полезно.

Если вы действительно не хотите изменять свою игру на использование скинов, вы всегда можете хранить Drawables в одном объекте и передавать этот объект.вокруг каждого экрана, поэтому он не загружает спрайты при каждом изменении экрана.

...