1

我使用 LRU 和磁盘缓存将一些图像缓存在内存和磁盘上。以前我用

private LruCache<String, Bitmap> mMemoryCache;

保存图像,但是当我观察分配堆栈时,我看到了很多字符串分配,这对我来说很清楚,因为每次我使用mMemoryCache.get(cs);它都会分配一个新的字符串对象。

在我绘制每个位图的过程中,我需要在每帧中使用大约 50-100 次缓存,这将导致大量 GC,因为存在时间短的字符串。

我怎样才能防止这种情况?

我查看了有关如何防止字符串分配的其他问题,例如这个问题,我使用 David 的解决方案来显示 Debug FPS,但我不能将它用于这个特殊的缓存版本。

我将每个图像分成 100x100 的图块,我的缓存键看起来像这样pageNumber-withcount-heightcount-zoomfactor

我尝试使用 aStringBuffer但这不起作用,因为toString()将分配一个新的String,我需要比较内容。我可以尝试使用带有 000 的 int/float 作为“-”的替代品,甚至可以在我的缓存类中使用 char[] 数组,但是最好的方法是什么?

4

1 回答 1

0

为什么不使用 Integer 作为缓存键并按如下方式计算(假设 zoomfactor 也 < 100):

int keyInt = (((pageNumber * 100 + withcount) * 100) + 
              heightcount) * 100 + zoomfactor;
Integer key = Integer.valueOf(keyInt);

这仍然会分配对象,但是 Integer.valueOf 已经为其中的一些对象提供了缓存,并且对象会更小。自动装箱也将使用 Integer.valueOf(它不会为小数字创建新实例),只是避免使用 new Integer()。

于 2013-04-27T13:52:25.050 回答