使用LibGDX游戏
我有一个大厅屏幕 从大厅屏幕我可以去
Game 1 Game 2 Game 3 Game 4
当我退出游戏1(例如)时,我会回到大厅 这让我现在可以选择第3场比赛(例如)
我注意到的是java本机内存正在增长 当我做大厅 - >游戏1 - >大堂 - >游戏2 - >大堂 - >游戏3 - >大堂 - >第4场比赛......
从大厅我有
switch (selection) {
case 1: NewStage = new Game1Screen(); break;
case 2: NewStage = new Game2Screen(); break;
case 3: NewStage = new Game3Screen(); break;
case 4: NewStage = new Game4Screen(); break;
}
game.setScreen (NewStage);
这成功带我进入新游戏
现在在游戏画面中我有
switch (state) {
case EXITING: this.dispose();
game.setScreen(Lobby); <<-- probably causing the memory growth
break;
}
我认为这不会完全关闭关卡,从而导致Java Native Memory增长。
我希望在游戏退出后关闭并完全销毁游戏,我们又回到了大厅。
答案 0 :(得分:0)
要确保将所有内容都丢失,必须调用dispose()
方法。在那里,您可以调用屏幕内使用的每个对象的dispose()
方法。
您可以处理的事项包括Texture
,SpriteBatch
等。您可以通过调用
Sprites
costumSprite.getTexture().dispose();
如果你正确地完成了这一切,那么应该没有内存泄漏。
如果游戏崩溃,您也可以实施各种方式退出。就像这样的例子:
try {
//The creation of the application
} catch (Exception e) {
Gdx.app.exit();
System.out.println(e);
}
答案 1 :(得分:0)
你可以做一些简单的事情。首先,我会在切换屏幕时记录内存,看看你是否正确应用程序内存(而不是VM!)增长:
static class MySecurityManager extends SecurityManager
{
public String getCallerClassName(int callStackDepth)
{
return getClassContext()[callStackDepth].getName();
}
}
private static Runtime runtime = Runtime.getRuntime();;
private static final long KILOBYTE = 1024L;
private static MySecurityManager securityManager = new MySecurityManager();
public static long bytesToMegabytes(long bytes)
{
return bytes / KILOBYTE;
}
public static void CurrentMemoryUsage()
{
long memory = runtime.totalMemory() - runtime.freeMemory();
Gdx.app.log("[LOG] " + securityManager.getCallerClassName(2), " Used memory: " + bytesToMegabytes(memory)
+ "kb");
}
你调用静态Logger.CurrentMemoryUsage()
的所有地方都会自动记录调用类(securityManager.getCallerClassName(2)
)和当前的内存使用情况。 (注意这不是最快的记录方式!获取调用者类可能很慢但是这已经是最快的方法。我认为这非常有用。请参阅how to get the calling class)
切换后使用System.gc()
调用Gabagecollector。这需要深度收集,这需要花费一些时间,所以只要确实需要时间就可以在没有问题时调用它。 (mapswitch,screenchanges等)
我可以建议您检查内存的最后一件事是使用java sdk中的jconsole.exe
。 C:\Program Files (x86)\Java\jdk1.7.0_45\bin\jconsole.exe
以桌面模式启动应用程序并使用jconsole连接到它,您可以看到它使用了多少RAM等。您甚至可以查看当前创建的课程数量等等。在使用应用程序时,请查看内存中的图形,以查看它是否真的上升,或者您是否只有内存的正常起伏。如果它确实上升,请在渲染周期内创建对象时查看对象。 (jconsole
会告诉您是否创建了越来越多的对象)
如果是这样,请删除渲染周期内对象的创建。 (在任何抽奖,行为或更新中都没有新内容!)
希望这确实有帮助。
答案 2 :(得分:0)
屏幕具有hide()方法,当您使用
设置屏幕时调用该方法game.setScreen(yourScreen);
如果您不再需要它们,则必须手动处理以下类: AssetManager,Bitmap,BitmapFont,BitmapFontCache,CameraGroupStrategy,DecalBatch, ETC1Data,FrameBuffer,Mesh,ParticleEffect,Pixmap,PixmapPacker,ShaderProgram,Shape, Skin,SpriteBatch,SpriteCache,Stage,Texture,TextureAtlas,TileAtlas,TileMapRenderer com.badlogic.gdx.physics.box2d.World 因此,如果你使用其中一些将它们放在hide上。
答案 3 :(得分:0)
这是一个非常强大的libgdx政策,特别是我是android开发者。
dispose
函数声明为hide
,但从未从系统调用过。现在我只看到两种方式。
首先,如前所述 - 移动hide
处的所有免费资源操作,因为在更改屏幕或关闭应用程序时调用了hide
。
其次,在ScreenAdapter
实施所有者dispose
和手动调用hide
。