2

私は、環境の設計と視覚化の両方にアプローチするためにさまざまな概念を試すことによって、2D「ゲーム」プログラミングでいくつかのテストを行おうとしています。

赤ちゃんのステップでは、Swingを使用し、JComponentのpaintComponent()メソッドを使用してGraphics2Dオブジェクトを取得し、それを使用してゲームボードを視覚化しました。

非常にうまく機能しますが、ゲームモデル全体を繰り返しチェックしてビューを更新する必要があります。基本的には1/10秒に1回、何かが変わる可能性があります。

JComponentでrepaint()を呼び出して、ビューを完全に更新することでビジュアルをペイントします。ゲームボードにあるすべてのタイルの情報を確認し、ボード上のすべてのタイルについて、このデータに従ってそのタイルをペイントします。しかし、ペイントが必要なタイルを約1000〜4000タイルに近づけると、ビュー全体のペイントに100ミリ秒以上かかるため、何かを行うときに一定のラグが発生するようになります。

さて、質問です。私は、このアプローチのパフォーマンスを改善する方法についての方法または意見を探しています。ボード上のすべてのタイルが「目盛り」ごとに変わるわけではないので、このタイルを「塗り直す」必要はありません。ただし、逆に、視覚野(カメラオフセット)を移動すると、画面上のすべてのタイルの位置が変わるため、別の位置で再ペイントする必要があります。また、「would be」アニメーションのその後の実装では、「ハプニング」の有無に関係なく、視覚野を常に更新する必要があります。30 FPSを超える高品質のグラフィックス(またはminecraftのような単純なもの)で実行されている3Dゲームを見るとき、グラフィックスに関してさらに問題が発生する前に、すぐにOpenGLに切り替える必要があるかどうか疑問に思っています。

4

2 に答える 2

1

boolean各タイルの2次元配列とint、変更の定数を保持する変数を宣言し、変更のたびに更新します。例:

public void updateTiles(){

    if(changeType == NO_CHANGE){
        //do something
    }
    else if(changeType == BOARD_MOVED){
        repaint();
    }
    else if(changeType == TILE_CHANGED) {
        for(int i = 0; i < changeList.length; i++) {
            for(int j = 0; j < changeList[i].length; j++) {
                if(changeList[i][j]) {
                    repaint(i * TILE_SIZE, j * TILE_SIZE, TILE_SIZE, TILE_SIZE );
                    changeList[i][j] = false;
                }
            }
        }
    }

    changeType == NO_CHANGE; 
}
于 2012-10-26T18:24:42.343 に答える
1

次のような操作を行うことで、UIを段階的に更新できます。

void tileChanged(final Tile tile) {
    EventQueue.invokeLater(new Runnable() {
        @Override public void run() {
            tile.renderTo(jpanel.getGraphics());
        }
    };
}

または、レンダリングパイプラインを切り替えるなどして、Java2Dレンダリングの調整を試みることもできます。

または、Java 2Dを捨てて、たとえばLWJGLを介してOpenGLと直接通信することもできます。

于 2012-10-26T19:26:20.460 に答える