現在、マップレンダリングライブラリのパフォーマンスを改善しようとしています。時間指定記号の場合、ライブラリは実際には、各場所に同じ画像を何度も描画することがよくあります。ただし、シンボルのパラメータ化は非常に豊富であるため、描画プロセスは非常に複雑になる可能性があります。ポイントごとに、描画しようとしている画像を計算するツリー構造があります。前に述べたように、パラメーターが処理中のデータに依存しない場合は、複雑なシンボルを数回描画するだけです。
キャッシュメカニズムを実装しようとしました。すでに描画されている画像を保存し、すでに満たされている構成に遭遇した場合は、画像を取得して再度描画します。私が行った最初のテストは、非常に単純なシンボルに対するものです。形もインテリアも塗りつぶされた円です。
シンボルはすべての場所で一定になることがわかっているので、シンボルをキャッシュして、キャッシュされた画像から再度描画します。それはうまくいきます...しかし私は2つの重要な問題に直面しています:
- 描かれたシンボルの品質はほとんど損なわれません。
- さらに問題があります。マップのレンダリングに必要な時間は、キャッシュを使用しない場合よりもキャッシュを使用した場合の方が実際に長くなります。それはキャッシュにとってかなり残念です^_^
キャッシュメカニズムがオンの場合のコアコードは次のとおりです。
if(pc.isCached(map)){
BufferedImage bi = pc.getCachedValue(map);
drawCachedImageOnGeometry(g2, sds, fid, selected, mt, the_geom, bi);
} else {
BufferedImage bi = g2.getDeviceConfiguration().createCompatibleImage(200, 200);
Graphics2D tg2 = bi.createGraphics();
graphic.draw(tg2, map, selected, mt, AffineTransform.getTranslateInstance(100, 100));
drawCachedImageOnGeometry(g2, sds, fid, selected, mt, the_geom, bi);
pc.cacheSymbol(map, bi);
}
drawCachedImageOnGeometryで行われる唯一の興味深い呼び出しは
g2.drawRenderedImage(bi, AffineTransform.getTranslateInstance(x-100,y-100));
BufferedImageではなくVolatileImageインスタンスを使用しようと試みましたが、それはより深刻な問題を引き起こします(必要になるたびに画像が正しくレンダリングされるかどうかを確認できませんでした)。
私もいくつかのプロファイリングを行いましたが、キャッシュを使用する場合、最も時間がかかる操作はawtで行われたレンダリング操作であるようです。
そうは言っても、私の戦略は間違っていると思います...したがって、私の質問は次のとおりです。
- 私が説明した目標を達成するための効率的な方法はありますか?
- もっと正確に言えば、シンボルを描画するために使用されるAWT命令を保存し、必要に応じてそれらを変換する方が速いでしょうか?シンボルの作成に使用された「コマンド」を取得できる可能性があると思います...ワールドワイドウェブではそれに関する情報はあまり見つかりませんでしたが...可能であれば、それは節約になりますシンボルの計算時間(前述のように非常に複雑になる可能性があります)とシンボルの品質の両方を私に伝えます。
あなたが私に与えるすべての情報とリソースを事前に感謝します:-)
エイジメン。
編集:レンダリングできるグラフィックスの詳細は次のとおりです。私が実装しているシンボルモデルによると、グラフィックは非常に単純(つまり、その形状で塗りつぶされた正方形)だけでなく、非常に複雑(たとえば、形状と塗りつぶしの両方がハッチで描かれているラベル、およびハローの場合でも)になります。私が望むならそれの周り)。ほとんどの構成で次のことができると確信しているため、キャッシュを使用したいと思います。
- 同じスタイルでスタイル設定された同じソースの2つの異なるシンボルを描画するために使用されたパラメータを区別します。
- 同じパラメータ(場所を除く)を持つ2つのソースが、同じスタイルに対して同じシンボルを生成することを確認してください。ただし、2つの異なる場所にあります(翻訳のみが必要です)。
これらの2つのポイントがあるため、キャッシングは良い戦略のようです。さらに、同じ画像に何千もの重複したシンボルが描画される場合があります。