0

我正在为安卓移动平台开发一款游戏,一切都很顺利。但是,我现在想解决一些我在开发过程中注意到但直到现在一直被忽略的问题。

我正在使用 LRUCache 来存储带有键的 AndroidBitmap对象。Integer问题是,当我尝试Bitmap使用原始类型的键将 a 存储在 LRUCache 中时intInteger对象分配内存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

4

2 回答 2

0

我不知道使用原始int键的 Java 缓存,但修改开源缓存(例如 Guava)应该不会太难:删除“implements Map”语句,将所有Ks替换为ints,并将所有Vs替换为Objects (我面前没有源代码,但我见过的每个 Java 缓存都只是一个Map<K, V>驱逐逻辑的加分项)。您还需要将调用替换为key.hashCode()内联的哈希函数(只需在 Google 上搜索合适的函数,您可以使用 获得便宜的函数abs(key * prime_number) modulo size_of_backing_array)。

于 2013-07-28T01:42:38.693 回答
0

我创建了一个名为Banana的新开源原始集合库,您可以使用它。那里有一个具有原始长键的LRU 类。支持的数据是 int、long 或 Java 对象——这正是您所需要的。请注意,香蕉通常不是线程安全的,因此请务必进行适当的同步。

PS:该项目还处于早期阶段,我没有正式发布。API 将来可能会发生变化。

顺便说一下,看看 BlockAllocator 等其他类,以及原始链表和映射,我认为它们对 Java 游戏编写者特别有用。

于 2013-07-28T07:17:04.590 回答