0

我计划通过以下方式在Android(3.0)中创建2D(地形)地图的表示

  • 一个类MapCoordinate,它只是一个“结构”,由 int 类型的公共属性 x,y 组成,表示 MapCoordinate
  • 一个类MapPoint(可能不是一个好名字),它封装了访问和更改地图中某个点的数据的方法(对于一个地图坐标)
  • 一个类Map,它有一个实例/ Map(我的应用程序中只有一个)并通过具有一个封装一个 Map HashMap

    public class Map {
        HashMap<MapCoordinate, MapPoint> mapPoint = new HashMap<MapCoordinate, MapPoint>();
    }
    

所以,我的问题是:在 Android 上拥有许多(Java)对象实例是否对性能至关重要(只有平板电脑是我的应用程序的目标)。当然,这张地图只是我整个应用程序的一小部分。地图可以变得相当大。

感谢您的反馈意见。

4

1 回答 1

2

如果可能,您可以尝试实现Fly Weight模式。官方文档建议避免创建对象:

避免创建对象

对象创建从来都不是免费的。具有临时对象的每个线程分配池的分代 GC 可以使分配更便宜,但分配内存总是比不分配内存更昂贵。

如果您在用户界面循环中分配对象,您将强制进行定期垃圾回收,从而在用户体验中产生一些“小问题”。

因此,您应该避免创建不需要的对象实例。一些可以提供帮助的示例:

  • 从一组输入数据中提取字符串时,尝试返回原始数据的子字符串,而不是创建副本。您将创建一个新的 String 对象,但它将与数据共享 char[]。
  • 如果您有一个返回字符串的方法,并且您知道无论如何它的结果将始终附加到 StringBuffer,请更改您的签名和实现,以便该函数直接执行附加,而不是创建一个短暂的临时对象。

一个更激进的想法是将多维数组分割成并行的单一一维数组:

  • 整数数组比整数数组要好得多,但这也概括为这样一个事实,即两个并行整数数组也比 (int,int) 对象数组更有效。对于原始类型的任何组合也是如此。
  • 如果您需要实现一个存储 (Foo,Bar) 对象元组的容器,请记住两个并行的 Foo[] 和 Bar[] 数组通常比单个自定义 (Foo,Bar) 对象数组好得多。(当然,例外情况是,当您设计 API 以供其他代码访问时;在这种情况下,通常最好以正确的 API 设计换取速度的小幅影响。但在您自己的内部代码中,您应该尽可能高效。)

一般来说,尽可能避免创建短期临时对象。创建的对象越少,垃圾收集的频率就越低,这对用户体验有直接影响。

于 2011-02-15T20:16:06.550 回答