AndroidアプリケーションのビットマップにGoogle Guava LoadingCacheを読み込みます。アプリケーションでは、キャッシュのビットマップをキャンバスにペイントする描画スレッドを実行しています。特定のビットマップがキャッシュにない場合は、描画されず、読み込みスレッドがブロックスレッドをブロックすることはありません。AndroidでGuavaキャッシュのパフォーマンスが悪い
しかし、ペインティングでは視覚的な吃音が発生し、1秒あたりのフレームレートはどのようにして欲しいのですか?私はそれをキャッシュのgetIfPresent()
メソッドに釘付けにしました。それだけで、アプリケーションの総CPU時間の20%以上を占めます。これは、すでに存在しているビットマップの唯一のルックアップで、心の中で
ベア:getIfPresent()
でLocalCache$Segment.get()
は、時間の80%以上を要します。 get()
に負荷が発生することはありません。私は、セグメントが一杯になった場合にどの退去が起こるかを決定するLRUキューについて、簿記オーバーヘッドがget()
にあると考えました。しかし、これは少なくともKey-Lookup
のLRU-LinkedHashmap.get()
で私に与えられるものよりも遅いものです。
ルックアップが遅い場合、要素がキャッシュ内にある場合、高速ルックアップを取得するためにキャッシュを使用します。キャッシュにはポイントがありません。私もgetAllPresent(a)
とasMap()
を試しましたが、同等の性能を発揮します。
ライブラリのバージョンは次のとおりです。グアバ-11.0.1.jar
次のようにLoadingCacheが定義されています
LoadingCache<TileKey, Bitmap> tiles = CacheBuilder.newBuilder().maximumSize(100).build(new CacheLoader<TileKey,Bitmap>() {
@Override
public Bitmap load(TileKey tileKey) {
System.out.println("Loading in " + Thread.currentThread().getName() + " "
+ tileKey.x + "-" + tileKey.y);
final File[][] tileFiles = surfaceState.mapFile.getBuilding()
.getFloors().get(tileKey.floorid)
.getBackground(tileKey.zoomid).getTileFiles();
String tilePath = tileFiles[tileKey.y][tileKey.x].getAbsolutePath();
Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
return BitmapFactory.decodeFile(tilePath, options);
}
});
私の質問
は以下のとおりです。- が、私はそれを使用していますか違う?
- Androidの実装は固定されていませんか?
- 設定オプションがありませんでしたか?
- これは、作業中のキャッシュに関する既知の問題ですか?
更新:
約100フレームは塗装後CacheStatsは以下のとおりです。そのミスカウントがbasicly HITCOUNT刻みと同じまま
I/System.out(6989): CacheStats{hitCount=11992, missCount=97,
loadSuccessCount=77, loadExceptionCount=0, totalLoadTime=1402984624, evictionCount=0}
後。この場合、キャッシュは負荷がまばらに発生するのに十分ですが、getIfPresentは遅いです。
他のフレーズを太字にしないでください。私はそれを取り出すために編集を提出したので、読むのは難しいです。 – simchona
ありがとう、それをより読みやすくするための編集のためのsimchona。 – user643011
'tiles.cacheStats()'の結果を投稿できますか? –