Javaゲーム作成総合スレ
■ このスレッドは過去ログ倉庫に格納されています
0168名前は開発中のものです。
2009/01/08(木) 07:19:56ID:4pdEl9iG自前のCompositeを使うと、内部でGeneralCompositePipeという物が使われる。
sun.java2d.pipe.GeneralCompositePipeの88-89行目を見ると、
dstIn = dstRaster.createChild(x, y, w, h, 0, 0, null);
dstOut = dstIn.createCompatibleWritableRaster();
となっている。この時確保されるdstOutのサイズはw×hではなくて、dstRasterと同じサイズになる。
(java.awt.image.Rasterのソースを参照)
多分開発者は、createCompatibleWritableRaster(w,h);と同じ結果を期待していたんだと思う。
そのせいで、大量のメモリの確保を何度も行う事になる。何度も。
しかも、大きい図形は内部で32×32に分割して描画しているからメモリを確保する回数がさらに増加する。
これではアクセラレーション以前の問題。
どう見てもバグだけど、誰もゲームに使わないからか特に問題にならず、一向に修正されない。
描画に使う一時的なRasterは一々確保せずにキャッシュを使ってほしいけど、面倒だったのか毎回確保してる。
だから、自作Compositeをゲームに使いたいなら、Graphics2Dを使わず自分で処理するのが無難。
英語が得意なら、バグを報告して修正を待つ手もあるけど。
あと、Composite内で使うgetPixels()やsetPixels()も妙に遅い気がする。
sun.awt.image.DataBufferNativeが怪しい。自分の所だけかもしれないけど。
■ このスレッドは過去ログ倉庫に格納されています