Intellij Idea 使用libgdx时,哪些内存泄漏/损坏会导致崩溃?

svmlkihl  于 2024-01-05  发布在  其他
关注(0)|答案(1)|浏览(129)

我正在编写一个选择你自己的冒险游戏,其中每个游戏状态是一个不同的屏幕类。当你点击屏幕上的相应按钮时,你会创建一个类的示例(将显示)(想想亨利火柴人游戏,但要简单得多)。我不知道如何做到这一点;这是我的第一个真实的游戏。
以下是我目前为止的两个课程:

  1. public class MarketScreen implements Screen {
  2. final Heist game;
  3. private final Texture backgroundImage;
  4. private final Music backgroundMusic;
  5. private Stage stage;
  6. private Table table;
  7. private TextButton button1;
  8. private TextButton button2;
  9. private TextArea text;
  10. private OrthographicCamera camera;
  11. public MarketScreen(final Heist game) {
  12. this.game = game;
  13. //load images (64x64 pixels)
  14. backgroundImage = new Texture("background.jpeg");
  15. //load sound effects and music
  16. backgroundMusic = Gdx.audio.newMusic(Gdx.files.internal("ironLung.mp3"));
  17. backgroundMusic.setLooping(true);
  18. //create camera and spriteBatch
  19. camera = new OrthographicCamera();
  20. camera.setToOrtho(false, 800, 480);
  21. //stage setup
  22. stage = new Stage(new ScreenViewport());
  23. Gdx.input.setInputProcessor(stage);
  24. //table setup
  25. table = new Table();
  26. table.setFillParent(true);
  27. stage.addActor(table);
  28. table.pad(50);
  29. table.padTop(100);
  30. //button and text box setup
  31. String dialogue = "You turn around from the market stall to the sound of your name at a shout. It's your long-time friend and " +
  32. " fellow bounty hunter, Wesdru. There's an urgency to her mannerisms that raises your heart rate immediately, " +
  33. "your hand flying to your sword pommel at your hip. 'It's Lorena. Dras has her.' Keegin Dras, this lawless town's " +
  34. "most feared crime boss. 'What,' you intone breathlessly. 'She doesn't stoop to meddle with cowboys!' Wesdru grabs " +
  35. "your shoulders roughly and makes brutal eye contact. 'I don't know why. But I do know we have to go NOW. You and I " +
  36. "both know how cruel Dras can be.'\n\n\n\nYou only have enough time to buy one thing from the market. What do you take?";
  37. text = new TextArea(dialogue, Heist.skin);
  38. table.add(text).grow().colspan(2);
  39. table.row();
  40. button1 = new TextButton("Modded Grenade", Heist.skin);
  41. table.add(button1).width(200).expand();
  42. button2 = new TextButton("Lockpick", Heist.skin);
  43. table.add(button2).width(100).expand();
  44. button1.addListener(new ChangeListener() {
  45. @Override
  46. public void changed(ChangeEvent event, Actor actor) {
  47. game.hasGrenade = true;
  48. game.setScreen(new OutsideScreen(game));
  49. dispose();
  50. }
  51. });
  52. button2.addListener(new ChangeListener() {
  53. @Override
  54. public void changed(ChangeEvent event, Actor actor) {
  55. game.hasLockpick = true;
  56. game.setScreen(new OutsideScreen(game));
  57. dispose();
  58. }
  59. });
  60. }
  61. @Override
  62. public void show() { //called when screen is shown.
  63. backgroundMusic.play();
  64. }
  65. @Override
  66. public void render(float delta) {
  67. ScreenUtils.clear(1, 0, 0, 1);
  68. game.batch.begin();
  69. game.batch.draw(backgroundImage, 0, 0);
  70. game.batch.end();
  71. stage.draw();
  72. }
  73. @Override
  74. public void resize(int width, int height) {
  75. }
  76. @Override
  77. public void pause() {
  78. }
  79. @Override
  80. public void resume() {
  81. }
  82. @Override
  83. public void hide() {
  84. Gdx.input.setInputProcessor(null);
  85. }
  86. @Override
  87. public void dispose() {
  88. game.batch.dispose();
  89. backgroundImage.dispose();
  90. backgroundMusic.dispose();
  91. stage.dispose();
  92. }
  93. }

个字符
每次我点击MarketScreen示例中的一个按钮,下一个屏幕就会崩溃。有时会持续大约15秒,然后在没有背景图像的情况下再运行几秒钟(只是在render方法中显示默认的屏幕填充)然后崩溃,但它总是崩溃。错误消息总是以

  1. A fatal error has been detected by the Java Runtime Environment:
  2. SIGSEGV (0xb) at pc=0x000000010d7fa85c, pid=22079, tid=23555


我相信它描述了一个分段错误,通常是由内存泄漏引起的。
可能是什么问题?为什么它会以不同的速度坠毁?
我最初将TextButton、Stage、Table和其他对象作为游戏属性,并简单地更改了它们在每个屏幕中的文本和排列,但我认为Stage可能是编写为特定于类的,所以我重构了每个屏幕类以创建自己的对象。游戏现在通常崩溃得更慢,但它仍然崩溃。
编辑:由于我希望屏幕能够根据跟踪游戏进度的布尔值进行调整,所以我没有提前创建所有屏幕。相反,我最终将创建按钮和创建侦听器的代码放在show()中,并从hide()调用dispose()(因为hide是更改屏幕时自动调用的唯一方法),这似乎有效!

pbpqsu0x

pbpqsu0x1#

我认为你创造了意大利面。

错误行:

  1. game.setScreen(new OutsideScreen(game));

字符串

**说明:**你创建新的类,每次你点击第二线程。然后在第一(渲染)线程你画。赛车之间发生2线程和上帝知道接下来会发生什么。
**修复:**在create()方法(init)中调用this

  1. OutsideScreen os = new OutsideScreen(game);
  2. NEXTSCREEN ns = new NEXTSCREEN(game);
  3. //to swap
  4. game.setScreen(ns);
  5. game.setScreen(os);


单击按钮时删除dispose()。
要dispose在class >>public class MyGdxGame中调用它,需要在dispose()中扩展ApplicationAdapter<<。

展开查看全部

相关问题