ウィンドウサイズの変更に応じてグリッドのサイズを変更するグリッドベースのゲームを作成しています。また、将来的には照明効果にカラーフィルターを適用する可能性があります。グリッドの正方形の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
。このコードではすべての画像が失われます。
それでは、いくつか質問があります。
- drawImageで繰り返しスケーリングする場合のパフォーマンスコストはいくらですか?フレーム間でウィンドウのサイズが変更されていなくても、違いはありますか?
- 2番目のコードスニペットを機能させるにはどうすればよいですか?何が問題になっていますか?
- タイルに照明フィルターを適用した場合、フレームごとに実行すると、プロセッサー時間も大量に消費されますか?(800x800程度のディスプレイで225程度の小さな画像を考えてください)
- 照明フィルターを適用するためのベストプラクティスは何ですか?マップ全体に真っ暗なフィルターを重ねて、光源の周りの領域を露出することを計画しています。
これで助けてくれてありがとう!