2016-07-19 11 views
1

最近Javaで2dプラットフォームの開発を開始し、パフォーマンス関連の質問をしています。Java platformerのゲームパフォーマンス

私のゲームでは、私は世界があります(今は比較的小さい)。

しかし世界の半分以上はプレーヤーのカメラには見えませんが、私はまだ全世界(見えない部分も)を描いています。

ここに私が今やっていることがあります。

@Override 
public void paintComponent(Graphics g){ 
    g.translate(player.camX(), player.camY()); 

    for (GameObject gameObject : solidObjects){ 
     if (gameObject.isTouching(player.getCameraRect())) 
      gameObject.paint(g); 
    } 

    player.paint(g); 

    for (GameObject gameObject : unSolidObjects){ 
     if (gameObject.isTouching(player.getCameraRect())) 
      gameObject.paint(g); 
    } 

} 

したがって、絵が表示される前に画面上にif文があるかどうかを調べるのが速いでしょうか?

答えて

1

はい。

画面に表示されているかどうかを確認するには、1〜2ステップ以上かかることはありません。

すべてをペイントするには、使用しているかどうかに関係なく、すべてのピクセルを画面に描画する必要があります。

1

gameObject.paint(g);には多くの描画呼び出しが含まれていますが、分岐(チェック)はコストよりも多くの作業を節約します。スプライトをペイントする描画呼び出しのようなものであれば、ライブラリはバッファオーバーランを避けるためにこのようなチェックを実行していて、あなたのライブラリは冗長になります。

しかし、ここでパフォーマンスの問題に直面している場合は、何らかのデータ構造を使用することをおすすめします。簡単なものはそうのようなグリッドです:

enter image description here

あなたの要素が移動し、彼らが占めるグリッド細胞からそれらを削除し、それらが占める新しいもの(複数可)にそれらを挿入します。これは、これを効率的に実装する場合には、少数の整数を操作するだけです。

次に、画面上に要素を描画する場合は、重なっているグリッドセル内の要素のみを描画します。そうすれば、ゲーム世界のすべての要素をループするのを防ぐことができます。これは、必要に応じて衝突の検出を高速化するのにも便利です。

アップデートには少しコストがかかりますが、クワッドツリーを使用することもできますが、ゲーム内の要素がまばらに配信されている場合は、検索品質を向上させることができます。

関連する問題