私は最初のゲームを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();
}
}
描画の問題は、おそらくあなたが表示していないSwingコードにあります。まずレンダリング処理時間を調整せずに簡単なアニメーションループを試してください。私の[Retro Snake Game](http://java-articles.info/articles/?p=768)の記事を見て、Swingアプリケーションをアニメーションループでコーディングする方法を見てください。 –
申し訳ありませんが、誤ってスイングを追加しました。私はそれを使用していません。タグを削除しました。私はまだあなたの記事を読んで、私が多分それを理解することができるかどうかを見ます。 – Salviati