2016-10-08 6 views
0

私は最初のゲームをJavaで作ろうとしていますが、問題を見つけました。私が最初に私のゲームループとFPSカウンターを書いたとき、私は自分でそれを実行しようとしましたが、それはうまく動作しませんでしたので、私は私が見つけたこのコードを使用し、オンライン:それは素晴らしい作品render()がアクティブなときにコンピュータフリーズ

public void run(){ 
    long lastTime = System.nanoTime(); 
    double amountOfTicks = 60.0; 
    double ns = 1000000000/amountOfTicks; 
    double delta = 0; 
    long timer = System.currentTimeMillis(); 
    int frames = 0; 
    while(running){ 
     long now = System.nanoTime(); 
     delta += (now - lastTime)/ns; 
     lastTime = now; 
     while(delta >= 1){ 
      tick(); 
      delta--; 
     } 
     if(running){ 
      render(); 
     } 
     frames++; 

     if(System.currentTimeMillis() - timer > 1000){ 
      timer += 1000; 
      System.out.println("FPS: " + frames); 
      frames = 0; 
     } 
    } 
    stop(); 
} 

が、私render()関数を追加すると、ウィンドウはちょうど一種の凍結になります。私はまだウィンドウを閉じることができますが、コンピュータ全体を再起動する必要があることもあります。ここにレンダリング機能があります。

private void render(){ 
    BufferStrategy bs = this.getBufferStrategy(); 
    if(bs == null){ 
     this.createBufferStrategy(3); 
     return; 
    } 

    Graphics g = bs.getDrawGraphics(); 

    g.setColor(Color.green); 
    g.fillRect(0, 0, WIDTH, HEIGHT); 

    handler.render(g); 

    g.dispose(); 
    bs.show(); 
} 

私はレンダリング機能のすべてをコメントアウトした場合、私は白い画面を取得し、私は周りに移動し、周りの16200000.の「定数」FPSができ魔女が現れるが、レンダリング関数のコードはアクティブになって、 FPSは次のようになります。

FPS: 8644 
FPS: 1 
FPS: 5977 
FPS: 3189 
FPS: 3930 
FPS: 8120 
FPS: 1 
FPS: 8024 
FPS: 1 

ない安定性や一貫性、誰もが知っている私が間違ってやっていますか?私のオペレーティングシステムはUbuntu Mateです。もし重要であればopenjdkバージョン1.8.0_91を使用します。前もって感謝します。

完全なコード:

package com.tutorial.main; 

import java.awt.Canvas; 
import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.image.BufferStrategy; 

public class Game extends Canvas implements Runnable{ 

private static final long serialVersionUID = 1550691097823471818L; 

public static final int WIDTH = 640, HEIGHT = WIDTH/12 * 9; 

private Thread thread; 
private boolean running = false; 

private Handler handler; 

public Game(){ 
    new Window(WIDTH, HEIGHT, "Lets Build!", this); 
    handler = new Handler(); 

    handler.addObject(new Player(100, 100, ID.Player)); 
} 

public synchronized void start(){ 
    thread = new Thread(this); 
    thread.start(); 
    running = true; 
} 

public synchronized void stop(){ 
    try{ 
     thread.join(); 
     running = false; 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

public void run(){ 
    long lastTime = System.nanoTime(); 
    double amountOfTicks = 60.0; 
    double ns = 1000000000/amountOfTicks; 
    double delta = 0; 
    long timer = System.currentTimeMillis(); 
    int frames = 0; 
    while(running){ 
     long now = System.nanoTime(); 
     delta += (now - lastTime)/ns; 
     lastTime = now; 
     while(delta >= 1){ 
      tick(); 
      delta--; 
     } 
     if(running){ 
      render(); 
     } 
     frames++; 

     if(System.currentTimeMillis() - timer > 1000){ 
      timer += 1000; 
      System.out.println("FPS: " + frames); 
      frames = 0; 
     } 
    } 
    stop(); 
} 

private void tick(){ 
    handler.tick(); 
} 

private void render(){ 
    BufferStrategy bs = this.getBufferStrategy(); 
    if(bs == null){ 
     this.createBufferStrategy(3); 
     return; 
    } 

    Graphics g = bs.getDrawGraphics(); 

    g.setColor(Color.black); 
    g.fillRect(0, 0, WIDTH, HEIGHT); 

    handler.render(g); 

    g.dispose(); 
    bs.show(); 
} 

public static void main(String args[]){ 
    new Game(); 
} 
} 
+1

描画の問題は、おそらくあなたが表示していないSwingコードにあります。まずレンダリング処理時間を調整せずに簡単なアニメーションループを試してください。私の[Retro Snake Game](http://java-articles.info/articles/?p=768)の記事を見て、Swingアプリケーションをアニメーションループでコーディングする方法を見てください。 –

+0

申し訳ありませんが、誤ってスイングを追加しました。私はそれを使用していません。タグを削除しました。私はまだあなたの記事を読んで、私が多分それを理解することができるかどうかを見ます。 – Salviati

答えて

0

問題は私のオペレーティングシステムでした。 JDK 8をインストールしてWindowsに切り替えたとき、すべてがうまくいった。たぶんLinuxマシンにOpenJDKがインストールされていて、面倒なことがあったかもしれません。正直なところ分かりません。それを見て、私がそれを見つけるかどうかを見ます。もしそうなら更新する。

関連する問題