1

ウィンドウサイズの変更に応じてグリッドのサイズを変更するグリッドベースのゲームを作成しています。また、将来的には照明効果にカラーフィルターを適用する可能性があります。グリッドの正方形の1つに画像を画面に描画するこのコードのパフォーマンスが心配です。

public void drawSquares(Graphics g){
        ListIterator<Viewport> iterator = vp.listIterator();
        while(iterator.hasNext()){
            Viewport v = (Viewport)iterator.next();
            BufferedImage img = v.getSqView().getImage();
            Rectangle b = v.getPixRect();

            g.drawImage(img, b.x, b.y, b.width, b.height, v.getSqView().getBackground(), null);
        }
        return;
    }

このコードは、画像(に格納されているimg)を取得し、それに収まる必要のあるピクセル長方形(に格納されている)を取得してbから、を介して割り当てられたスペースに描画しdrawImageます。

drawImageその場で画像を拡大縮小すると言います。つまり、すべての画像がフレームごとに再拡大縮小されます。ただし、ウィンドウのサイズが変更されることはめったにないため、同じことを何度も繰り返すと、多くのプロセッサ時間が無駄になるはずです。

これを見て、一度サイズ変更するとすべての画像を更新し、結果を保存して通常どおりに描画できるようにすることにしました。

このような:

public void resizeImage(int width, int height){
         BufferedImage resized = new BufferedImage(width, height, img.getType());
        Graphics2D g = resized.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.drawImage(img, 0, 0, width, height, 0, 0, img.getWidth(), img.getHeight(), null);
        g.dispose();
        img = resized;
    }

これは機能しません-私はそれがと関係があると思いますimg = resized。このコードではすべての画像が失われます。

それでは、いくつか質問があります。

  1. drawImageで繰り返しスケーリングする場合のパフォーマンスコストはいくらですか?フレーム間でウィンドウのサイズが変更されていなくても、違いはありますか?
  2. 2番目のコードスニペットを機能させるにはどうすればよいですか?何が問題になっていますか?
  3. タイルに照明フィルターを適用した場合、フレームごとに実行すると、プロセッサー時間も大量に消費されますか?(800x800程度のディスプレイで225程度の小さな画像を考えてください)
  4. 照明フィルターを適用するためのベストプラクティスは何ですか?マップ全体に真っ暗なフィルターを重ねて、光源の周りの領域を露出することを計画しています。

これで助けてくれてありがとう!

4

2 に答える 2

2

このフレームのサイズを変更しGridて、レイテンシーの主観的な感覚をつかみます。ここに示すアプローチを使用して、レイテンシーを測定します。プロファイラーで結果を確認します。

List<Image>提案したとおりにの要素のサイズを変更できない理由はありませんがadd()resizedインスタンスが作成されたときに新しいリストに変更します。

于 2013-01-19T08:11:06.350 に答える
1

drawImageを使用して繰り返しスケーリングする場合のパフォーマンスコストはいくらですか?フレーム間でウィンドウのサイズが変更されていなくても、違いはありますか?

常に測定する必要がありますが、ウィンドウのサイズが変更されていなくても、Javadocが言うように、このdrawImageメソッドの背後にキャッシュがないため、ここでは間違いなくパフォーマンスコストが発生します。コストはフレームレートにも依存します。

2番目のコードスニペットを機能させるにはどうすればよいですか?何が問題になっていますか?

2番目のコードスニペットは問題ないはずです。問題は別の場所にあると思います。「小さいが完全な」プログラムで問題を再現してみてください。それでも問題が発生する場合は、別の質問を投稿してください。

タイルに照明フィルターを適用した場合、フレームごとに実行すると、プロセッサー時間も大量に消費されますか?(800x800程度のディスプレイで225程度の小さな画像を考えてください)

あなたは常に測定する必要があります:)

照明フィルターを適用するためのベストプラクティスは何ですか?マップ全体に真っ暗なフィルターを重ねて、光源の周りの領域を露出することを計画しています。

これにはAlphaCompositeを使用できます。

于 2013-01-20T00:30:40.323 に答える