我正在为安卓移动平台开发一款游戏,一切都很顺利。但是,我现在想解决一些我在开发过程中注意到但直到现在一直被忽略的问题。
我正在使用 LRUCache 来存储带有键的 AndroidBitmap
对象。Integer
问题是,当我尝试Bitmap
使用原始类型的键将 a 存储在 LRUCache 中时int
,Integer
对象分配内存Integer.valueOf(int)
以将原始整数转换为Integer
等效的对象。
这一切都很好,但它会在我的游戏主循环的图形渲染部分导致并发垃圾收集,导致帧速率下降,当这种垃圾收集发生时,经常会产生明显的延迟。下面是我的日志的一部分,它测量了图形渲染发生所花费的时间。我的渲染方法很大程度上依赖于Bitmap
从 LRUCache 加载对象的使用,因此当分配可能非常频繁地发生时,为什么它会导致如下所示的延迟是可以理解的:
07-27 17:55:41.418: W/Render(13937): Time: 28ms
07-27 17:55:41.438: W/Render(13937): Time: 28ms
07-27 17:55:41.468: W/Render(13937): Time: 29ms
07-27 17:55:41.498: W/Render(13937): Time: 29ms
07-27 17:55:41.528: D/dalvikvm(13937): GC_CONCURRENT freed 384K, 13% free 17265K/19756K, paused 3ms+1ms, total 17ms
07-27 17:55:41.548: W/Render(13937): Time: 44ms
07-27 17:55:41.578: W/Render(13937): Time: 27ms
07-27 17:55:41.608: W/Render(13937): Time: 28ms
07-27 17:55:41.628: W/Render(13937): Time: 28ms
07-27 17:55:41.658: W/Render(13937): Time: 29ms
有什么办法可以Integer.valueOf(int)
在我的应用程序中分配内存?或者有没有接受原始类型的 LRUCache 的替代方法,例如int
?