【问题标题】:Performance issues with MapKit on iOS6iOS6 上 MapKit 的性能问题
【发布时间】:2012-10-16 16:52:29
【问题描述】:

更新到 iOS 6 后,我注意到在平移或缩放具有多个叠加层的 MKMapView 时服务器性能下降。我创建的一个应用程序有大约 600 个各种颜色的多边形叠加层,并且在 iOS 5 上运行无延迟(即使在较旧的 iOS 设备上),现在在 iOS 6 上运行非常滞后(缩放和平移时),即使在最新的设备上也是如此。

我的直觉是,这是因为设备必须实际动态地创建地图(因为它基于矢量),而不仅仅是在屏幕上显示图块。

有没有人有任何想法来减少平移或缩放地图时的延迟?

一些额外的信息,这种低帧率也会发生在缩放或平移覆盖层根本不显示在屏幕上的区域时,因此它与屏幕上出现的覆盖层的创建无关。

【问题讨论】:

  • 您是否分析了仪器的性能问题?
  • 我如何最好地测试它?我应该使用什么仪器?
  • 使用时间分析器(如果问题是 cpu 绑定的) - 它会告诉你代码中花费的时间最多的地方
  • 你能分享你的绘图代码吗? Mapkit 调用 drawMapRect: 方法并传递一个 mapRect。此 mapRect 可能包含也可能不包含您的叠加层。你的工作是只绘制与drawrect重叠的覆盖部分。网络上的很多代码都会为每个 drawrect 绘制整个叠加层。

标签: ios mkmapview ios6 mapkit mkoverlay


【解决方案1】:

您可以尝试将所有叠加层组合成一个。这可以显着提高性能。

这个想法是创建一个包含所有多边形的边界框的叠加层。这样您的mapView: viewForOverlay 将始终被调用。为包含所有多边形的叠加层创建一个属性。然后在覆盖视图的drawMapRect: 方法中,测试所有多边形是否与mapRect 相交,并在必要时绘制它们。这很重要,因为您不想绘制屏幕外的多边形。

此策略基于 Apple 自己的 MapKit 示例项目。查看HazardMap 获取在单个MKOverlayView 中绘制多个对象的示例,查看BreadCrumb 获取如何在drawMapRect 方法中有效测试多边形与当前mapRect 相交的示例

【讨论】:

    【解决方案2】:

    我有一个简约的 MapKit 技术演示,当我在装有 iOS6 的 iPad 3 上运行它时,它明显滞后。分析显示它受 CPU 限制,但只有 0.2% 来自我自己的代码。在我的例子中,罪魁祸首是渲染道路,然后是渲染标签——两者都是由 MapKit 完成的。我正在以 5 公里的比例显示旧金山市中心,因此有很多道路和标签要渲染。

    所以这个故事的寓意是:iOS6 地图很慢。不过,无法告诉您这与 iOS5 或 iPad 2 相比如何。但它落后了,我几乎没有做任何自己的工作。

    附注: 打开 Instruments 并使用 Time Profiler。进行录音+深入研究以找到罪魁祸首。然后检查“隐藏系统库”以找出您的责任与 MapKit 相比有多少滞后。然后仅根据需要进行优化。

    【讨论】:

      猜你喜欢
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多