当我切换屏幕时,它会滞后并且需要很长时间才能将其加载到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() {
}
}
答案 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
Texture
,TextureRegion
等方法不会使事情变糟。我有成百上千个这样的方法调用的接口,我认为这样做不会对加载时间产生任何影响。