個人的な練習のために、Java を使用してデスクトップ用の Flappy bird を作り直しています。すべての柱の生成、画面、背景の移動を行うことができましたが、パフォーマンスの問題が 1 つあります。
ゲームがそれほど速く動いていないと感じたり、0.5 秒程度動かなくなったりすることもありますが、そうではありません。鳥を動かすと、少し変な動きをし、前に進みすぎているように見えます。後ろに、MP4 形式の gif を見てください。
http://gyazo.com/d7e94c0b772192e5a5dd1d2b61b8c529
何が原因でしょうか?これは私のゲーム ループですか、それともグラフィックの描画方法ですか? 私はダブル バッファリングを使用しません。追加した JPanel を再描画する jframe で .repaint を呼び出すだけでレンダリングします。
ゲームループ:
private void gameLoop() {
new Thread() {
private long last;
private long start;
private int wait;
public void run() {
while(game) {
long now = System.nanoTime();
long length = now - lastLoop;
lastLoop = now;
double delta = length / ((double) Constants.OPTIMAL);
lastFps += length;
fps++;
if (lastFps >= 1000000000) {
System.out.println("FPS: " + fps);
lastFps = 0;
fps = 0;
}
update(delta);
render();
this.sleep
}
}
private void sleep() {
try {
Thread.sleep((this.last - System.nanoTime() + Constants.OPTIMAL) / 1000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
私の描画領域:
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
int translateAmount = this.game.getLevel().getTranslate();
g.translate(-translateAmount, 0);
this.background.render(g2d);
this.game.getLevel().renderLevel(g2d);
g.translate(0, 0);
this.game.getBird().render(g2d);
}
背景をレンダリングする方法は次のとおりです。背景を 1 つずつ追加し、背景がフレームの外側にある場合はレンダリングしません。
public void render(Graphics2D g) {
Iterator<RepeatedBackground> itr = this.repeats.iterator();
while (itr.hasNext()) {
RepeatedBackground b = itr.next();
if (this.game.getLevel().getTranslate() - b.getX() >= 300) {
itr.remove();
continue;
}
if (b.getX() - this.game.getLevel().getTranslate() < Constants.WIDTH) {
b.render(g);
}
}
}
これは私が鳥を動かす方法です(私はデルタを使用していません。これについていくつかのチュートリアルを使用しました):
private void update(double delta) {
if (System.currentTimeMillis() - this.level.getTime() >= Constants.TRANSLATE_SPEED) {
// move background
this.level.updateTranslate();
this.level.setTime();
// move bird
this.getBird().move();
}
}
public void move() {
this.x += 2 / 1.10;
}
鳥や背景の遅延の原因は何ですか? レンダリング方法やゲーム ループに何か問題がありますか?
FPSは常にこれを出力します:
FPS: 1724172
FPS: 1551857
FPS: 1494378
FPS: 1471987
FPS: 1434095
FPS: 1629905