首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java游戏在运行大约2分钟后继续崩溃(Intellij)

Java游戏在运行大约2分钟后继续崩溃(Intellij)
EN

Stack Overflow用户
提问于 2016-09-16 04:06:28
回答 1查看 235关注 0票数 1

我正在使用Intellij编写Java程序。

我目前正试图做一个自上而下的瓷砖射击。

我的问题是,大约2分钟后,我的游戏就崩溃了,弹出窗口说:"Java(TM)平台SE二进制程序已经停止工作。我记录了它崩溃3次所需的时间: 1m57s,1m59s,1m58s。

游戏目前处于一个非常简单的状态,我不确定是什么导致了这场碰撞。所有相关代码只有两个类: GameFrame.java (扩展JFrame)和GamePanel.java (扩展JPanel)。

GameFrame.java:

代码语言:javascript
复制
    package net.magnusfrater.tds.game;

    import javax.swing.*;

    public class GameFrame extends JFrame {

        public static final int width = 1000;
        public static final int height = width / 16 * 10;

        private GamePanel gp;

        public GameFrame () {
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setSize(width,height);
            setResizable(false);
            setLocationRelativeTo(null);

            setTitle("Time Based Fast Paced Top Down Shooter Demo");

            gp = new GamePanel();
            add(gp);

            setVisible(true);
        }

        public static void main (String[] args) {
            GameFrame gf = new GameFrame();
        }
    }

GamePanel.java

代码语言:javascript
复制
    package net.magnusfrater.tds.game;

    import net.magnusfrater.tds.input.Keyboard;

    import javax.swing.*;
    import java.awt.*;

    public class GamePanel extends JPanel implements Runnable {

        //panel
        private Thread thread;
        private static boolean running;
        private boolean fpsLock;

        //input
        private Keyboard kb;

        //game
        private Game game;

        public GamePanel () {
            //panel
            thread = new Thread(this, "Time Based Fast Paced Top Down Shooter Demo");
            running = true;
            fpsLock = true;

            //input
            //kb = new Keyboard();
            //addKeyListener(kb);

            //game
            //game = new Game(1);

            thread.start();
        }

        public void run () {
            long iTimeNS = System.nanoTime();
            int tickRate = 60;
            long ns = 1000000000 / tickRate;

            int ups = 0;
            int fps = 0;

            long iTimeS = System.nanoTime();
            long s = 1000000000;

            while (running) {

                long fTimeNS = System.nanoTime();
                if (fTimeNS - iTimeNS >= ns){
                    iTimeNS = System.nanoTime();

                    tick();
                    ups++;

                    if (fpsLock){
                        repaint();
                        fps++;
                    }
                }

                if (!fpsLock){
                    repaint();
                    fps++;
                }

                long fTimeS = System.nanoTime();
                if (fTimeS - iTimeS >= s){
                    iTimeS = System.nanoTime();

                    System.out.println("ups: " + ups + "\tfps: " + fps);

                    ups = 0;
                    fps = 0;
                }

            }

            System.exit(0);
        }

        public void tick () {
            if (kb != null)
                kb.tick();

            if (game != null)
                game.tick();
        }

        @Override
        public void update (Graphics g) {
            paint(g);
        }

        @Override
        public void paint (Graphics g) {

            g.setColor(Color.WHITE);
            g.fillRect(0,0,GameFrame.width, GameFrame.height);

            //if (game != null)
                //game.paint(g);
        }

        public static void quitGame () {
            running = false;
        }
    }

我最初认为问题是因为我为spritesheets加载图像的方式,或者可能是我为级别设计加载文本文件的方式,但在对这两种情况进行重新处理之后,问题仍然存在。

这让我很好奇,有点厌倦了,所以我试着找出更多关于坠机原因的解释。首先,我从弹出窗口中读到了更多,但它没有说什么有用的东西:(见下文)

第二,我看了Intellij提供的退出代码:(见下文)

我查了一下什么是退出代码255,但没有任何有用的东西。我能找到的最好的解释是退出代码255意味着真正的退出代码超出了范围:(见下文)

我在这一点上没有想法,所以我开始搜索所有我能想到的东西。谷歌搜索"Java(TM)平台SE二进制文件已经停止工作“的问题是,几乎所有建议的链接都是关于我的世界的问题。限制我的搜索堆栈溢出给我一些结果,但没有定论。我发现的一些修复是我已经尝试过的东西(比如没有正确地处理输入流,没有正确地处理缓冲的读取器,没有处理元素,等等)。我发现了这些链接,但它们都与我的问题没有真正的关联:

  1. (见下文)
  2. (见下文)
  3. (见下文)
  4. (见下文)
  5. (见下文)
  6. (见下文)

最后一个修复方法是重新安装Java 8u101和Java 8u102。然后我重新启动Intellij。然后我重新启动我的电脑。

什么都没用。

在这一点上,我觉得我只是个傻瓜。我忽略了一些我能看得出来的简单的东西。我遗漏了什么?

这可能是一个相关的问题。因此,如果我运行我的游戏几乎没有内容与fps没有锁定到60,我得到了非常荒谬的数字帧每秒。我不认为fps高达7,000,000。我认为。我不知道。我的程序也错了吗?下面是我的ups/fps输出的相关图片:见下文)

(见这里)所以Stack溢出不允许在某个阈值范围内得分超过2个链接的成员,并且绝对不允许发布图像。这里有一个指向google的链接,其中包含了我前面提到的所有链接和图像:https://docs.google.com/document/d/1XrBuVio19GmkFz0EfRzXVp5AJmM5zPfVO6vK3oS3Eaw/edit?usp=sharing

EN

回答 1

Stack Overflow用户

发布于 2016-09-16 10:43:03

尝试将您的-Xmx设置为2G,看看它是否运行得更长。如果是这样的话,有些东西正在分配内存,而且您可能有另一个设置集退出,而不是因为某种原因而不是垃圾收集。

此外,请尝试更改代码以限制使用番石榴RateLimiter的操作。

代码语言:javascript
复制
…
// class level
final RateLimiter frameLimiter = RateLimiter.create(60.0);
final RateLimiter outputLimiter = RateLimiter.create(1.0);
…
// in run method
while (running) {
  frameLimiter.acquire();
  repaint();
  fps++;
  if (outputLimiter.tryAcquire()){
    System.out.println("fps: " + fps);
    fps = 0;
  }
}

我删除了upstick()。你应该做你的工作后,重新油漆,我认为你不想做更多的工作,为下一个框架,这应该是最快的速度。稍后,您将需要添加逻辑来处理跳过帧时的跳过工作。在fps中增加repaint可能更有意义。如果同步了fps的增量和重置,则可以将输出放在自己的线程中,并且只有fps限制器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39523594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档