1

所以我有一张叠加了一堆 MKPolygonViews 的地图。当我在它上面放上一对时,如果我把它们都放在系统上,我会向系统发送一个 didReceiveMemoryWarning ,我通过删除覆盖层来响应该系统。

现在我想知道发生这种情况时它实际使用了多少内存,它只有 10MB 实际内存和 100MB 虚拟内存。当时的 SMS 应用程序使用 30MB 内存并且运行良好。还有其他应用程序,例如邮件,使用的不仅仅是我的应用程序。SpringBoard 增加了 5MB,所以没什么特别的。这也在 iPhone 4 上运行,所以应该有足够的内存(我的计算是大约 256MB 仍然可用)。

在我移除覆盖层后,内存占用仅下降约 1MB,当我重新打开它们时,它会上升 1MB,所以没有什么不寻常的。

那么发生了什么?内存警告是否来自图形内存或其他东西?这些叠加层的性能是否受到图形处理器的限制?当它们全部打开时,它在移动时确实使用了大约 60%,但这并不能解释糟糕的性能。

任何方向的答案将不胜感激。

编辑:Springboards 虚拟内存在覆盖打开的情况下上升到 450MB,一旦达到 512MB,它就会发送内存警告。这是导致问题的原因吗?总 VM 始终高于 512MB,因此它必须为 VM 使用闪存存储,因此不应导致内存警告

4

3 回答 3

1

解决方案是将所有 MKPolygonView 合并到一个 MKpolygonView 中。更多细节可以在这里找到

于 2010-09-17T00:42:21.263 回答
0

您可能应该通过仅显示在当前地图上实际可见的那些覆盖视图来优化该代码。为用户未查看的地图区域添加叠加视图是没有意义的。

于 2010-08-23T02:13:50.867 回答
0

我注意到的一件事是仅仅从地图视图中删除覆盖层(如 mkpolygon)是不够的。至少有两件事没有发生……

  1. 它不会释放所有内存
  2. 它没有从地图视图中完全清除覆盖

这会导致许多问题,尤其是当您可能使用大量大型覆盖时。我做了一些事情来抵消这一点。

  1. 我不能按照 AppleDevForum 帖子中的建议将它们全部塞进一个 MKPolygonView 或“MultiPolygonView”,因为我的目标是 iOS 3.2,它排除了对这些“仅限 iOS 4”类进行子类化......你仍然可以在 3.2 中使用它们,只是不将它们子类化
  2. 决定由于我的多边形中的坐标数量非常多,我随时将屏幕上的数量限制为两个。碰巧,对于我的应用程序,这是一个适当的期望。所以我将两个多边形视图存储为我的地图视图控制器的属性,并在必要时重用它们。
  3. 每当我需要释放内存(经常!)或每当我需要更改多边形时,我首先通过调用 [polygonView invalidatePath]使适当的多边形视图路径无效。只有在那之后,我才会重置多边形视图属性,然后从地图视图中删除叠加层(在必要时重新创建它们之前)。

这是我能够设法更改屏幕上的多边形叠加层、彻底清除旧多边形并强制释放内存的唯一方法。

如果有更好、更有效的方法来做这一切,我当然愿意接受建议!

于 2010-10-10T20:34:19.037 回答