2016-09-16 105 views
1

我正在使用Intellij来编程Java。Java游戏在运行约2分钟后不断崩溃(Intellij)

我目前正在尝试制作一个自顶向下的基于平铺的射手。我的问题是,大约2分钟后,我的游戏崩溃,弹出窗口显示“Java(TM)Platform SE Binary已停止工作,我记录了它花费3次的时间:1m57s,1m59s, 1m58s。

现在游戏处于非常简单的状态,我不知道什么可能导致崩溃。所有相关的代码只有两个类:GameFrame.java(扩展JFrame)和GamePanel.java (其扩展JPanel)

GameFrame.java:

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

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意味着真正的退出代码超出范围:(见下文)

我在这个时候没有想法,所以我开始简单地用Google搜索所有我能想到的。 “Java(TM)Platform SE Binary停止工作”的问题是几乎所有建议的链接都是关于Minecraft的问题。将我的搜索限制为Stack Overflow让我获得了一些结果,但没有任何结论。我发现的一些修补程序是我已经尝试过的东西(比如没有正确处理输入流,没有正确处理缓冲读取器,不处理元素等)。我发现这些链接,但他们都不是真正与我的问题:

  1. (见下文)

  2. (见下文)

  3. (见下文)

  4. (见下)

  5. (见下)

  6. (见下文)

最后修复我想是重新安装Java SE开发工具包8u101和Java SE开发工具包8u102。然后我重新启动了Intellij。然后我重新启动了我的电脑。

没有工作。

在这一点上,我认为我只是愚蠢的。我忽略了一些我可以分辨的东西。我错过了什么?因为如果我运行我的游戏时几乎没有任何内容,fps没有锁定到60,我每秒得到的帧数非常荒谬,我不认为这是一个可能相关的问题。 fps高达700万是可能的我想我不知道我有没有编程错误以及这是我的ups/fps输出的相关图片:[见下文])

(看到这里)因此堆栈溢出不允许成员的分数超过2个链接,并且绝对不允许发布图像。因此,这里是一个谷歌文档的链接了所有我上面提到的链接和图片的: https://docs.google.com/document/d/1XrBuVio19GmkFz0EfRzXVp5AJmM5zPfVO6vK3oS3Eaw/edit?usp=sharing

+0

您可能想要在该循环中进行睡眠,否则只会连续调用System.nanoTime()来超载CPU。 –

+0

我几乎总是在fps锁定在60的时候运行它(尤其是因为这个问题)。快速的问题,但我很难通过运行伤害我的CPU吗? –

+0

我怀疑你是否在伤害你的CPU,但你几乎肯定会让你的JVM崩溃。每帧运行循环的频率是否超过一次?如果不是的话,可以考虑在那里睡大约1/60秒。 –

回答

1

尝试和你的-Xmx设置为像2G,看看它是否运行更长的时间。如果是这样,某事正在分配内存,也许你有其他的设置集退出,而不是由于某种原因收集垃圾。

此外,请尝试更改您的代码以使用Guava's RateLimiter来限制事物。

… 
// 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()。你应该在重新粉刷后做你的工作,我认为你不想为下一帧做更多的工作,最快的时间应该是你的最大速度。稍后,您需要添加逻辑来处理帧跳过时跳过工作。我可以更有意义地在repaint内增加fps。 如果同步fps的增量和重置,则可以将输出置于其自己的线程中,并且仅限acquire限制器。