我使用LRU和磁盘缓存来缓存内存和磁盘上的一些图像。 以前我用过
private LruCache<String, Bitmap> mMemoryCache;
保存图像,但是当我观察分配堆栈时,我看到很多String分配,这对我来说很清楚,因为每次使用mMemoryCache.get(cs);
它都会分配一个新的String对象。
在我绘制每个位图的过程中,我需要每帧使用大约50-100次的缓存,因为生命串很短,会导致很多GC。
我该如何防止这种情况?
我查看了有关如何防止字符串分配的其他问题,例如this one,我使用David的解决方案来显示调试FPS,但我无法将其用于此特殊缓存版本。
我将每张图片分成100x100个图块,
我的缓存键看起来像pageNumber-withcount-heightcount-zoomfactor
我尝试使用StringBuffer
但这不起作用,因为toString()
会分配新的String
,我需要比较内容。
我可以尝试使用带有000的int / float替换“ - ”,或者甚至使用我的缓存类中的char []数组,但是最好的方法是什么?
答案 0 :(得分:0)
为什么不使用Integer作为缓存键并按如下方式计算(假设zoomfactor也<100):
int keyInt = (((pageNumber * 100 + withcount) * 100) +
heightcount) * 100 + zoomfactor;
Integer key = Integer.valueOf(keyInt);
这仍将分配对象,但Integer.valueOf已经为其中一些对象提供了缓存,并且对象将更小。自动装箱也会使用Integer.valueOf(不会为小数字创建新实例),只需避免使用新的Integer()。