GMSPolyline 非常大的内存峰值

2024-03-28

在允许用户在各种不同类型的地图上显示我们称之为轨迹的复杂位置点列表的 GPS 应用程序中,每个轨迹可以包含 2k 到 10k 个位置点。当轨迹在非 Google 地图类型上呈现时,它们会被大量剪切、修剪和路径简化。这是为了降低内存使用量并提高性能。即使在最坏的情况下,我们通常只会向 OpenGL 管道提交远少于一千个(聚合)转换后的位置点。

在集成 iOS 版 Google Maps SDK 时,我们最初尝试继续利用我们自己的 OpenGL 轨迹渲染系统,但遇到了 OpenGL 上下文使用冲突的问题(渲染工作,但我们无法获取 GMSMapView 和我们自己的内部 OpenGL 资源)都可以在没有人触及已删除内存的情况下释放)。

因此,我们尝试利用 GMSPolyline 构造并让 Google SDK 进行轨道渲染,但我们遇到了主要的内存使用问题,并且正在寻求解决这些问题的指导。

使用 Xcode Instruments,我们在创建大约 25 条折线,总共大约 23k 个位置点(不是每个位置点)时监控了内存使用情况。在折线创建过程中,应用程序内存使用量从约 14 MB 增长到约 172 MB,净峰值约为 158 MB。创建所有多段线后不久,内存使用量最终回落至 19 MB 左右,并且似乎稳定,累积净值约为 5 MB,因此似乎每个位置点需要大约 220 字节(5 MB / 23k 点)来店铺。

对我们造成伤害的是内存使用峰值。虽然我们的实验室测试仅使用了 23k 个位置点,但在现实世界中往往有更多,并且 iOS 似乎在之后放弃了我们的应用程序谷歌地图已消耗约 450 MBiPhone 5(而对于相同的测试用例,我们的内部折线渲染系统峰值约为 12 MB)。

显然GMSPolyLine构造不适用于我们需要的重量级使用。

我们尝试使用单独的自动释放池包装一些折线创建循环,然后在适当的点耗尽这些循环,但这对内存使用没有影响。创建多段线并将控制返回到主运行循环后的峰值内存使用量根本没有变化。后来原因就清楚了;在创建折线后的第一个 DisplayLink 回调之前,Google 地图系统不会释放资源。

我们的下一步工作将是手动限制我们在 GMSPolyline 推送的数据量,可能使用我们自己的边界测试、裁剪、修剪和最小化,而不是依赖 Google 地图来有效地完成此操作。

这里的缺点是,这意味着将分配和释放更多的 GMSPolyline 对象,可能是在用户在地图上平移/缩放时。每个对象的位置点都会少得多,但我们仍然担心这种方法的不可预见的后果,即许多 GMSPolyline 分配和释放的隐藏开销。

所以问题是,处理这种情况的最佳方法是什么,谷歌的人可以透露一些信息吗?GMSPolyline最佳实践、上限、瓶颈等?


为什么不尝试使用基于基本 http 请求的 google API 进行指导。https://developers.google.com/maps/documentation/directions/ https://developers.google.com/maps/documentation/directions/。 (检查许可条件和请求数量)。

然后使用 IOS MKPolyline 绘制数据。我相信你会有更好的表现。而且您将只依赖谷歌获取定位数据。

要将 google API 的响应转换为坐标,请使用下面众所周知的方法(取自其他帖子):

- (NSMutableArray *)parseResponse:(NSDictionary *)response
{
    NSArray *routes = [response objectForKey:@"routes"];
    NSDictionary *route = [routes lastObject];
    if (route) {
        NSString *overviewPolyline = [[route objectForKey: @"overview_polyline"] objectForKey:@"points"];
        return  [self decodePolyLine:overviewPolyline];
    }
    return nil;
}


-(NSMutableArray *)decodePolyLine:(NSString *)encodedStr {

    NSMutableString *encoded = [[NSMutableString alloc]initWithCapacity:[encodedStr length]];
    [encoded appendString:encodedStr];
    [encoded replaceOccurrencesOfString:@"\\\\" withString:@"\\"
                                options:NSLiteralSearch range:NSMakeRange(0,
                                                                          [encoded length])];
    NSInteger len = [encoded length];
    NSInteger index = 0;
    NSMutableArray *array = [[NSMutableArray alloc] init]; NSInteger lat=0;
    NSInteger lng=0;
    while (index < len) {
        NSInteger b; NSInteger shift = 0; NSInteger result = 0; do {
            b = [encoded characterAtIndex:index++] - 63; result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        NSInteger dlat = ((result & 1) ? ~(result >> 1)
                          : (result >> 1)); lat += dlat;
        shift = 0; result = 0; do {
            b = [encoded characterAtIndex:index++] - 63; result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        NSInteger dlng = ((result & 1) ? ~(result >> 1)
                          : (result >> 1)); lng += dlng;
        NSNumber *latitude = [[NSNumber alloc] initWithFloat:lat * 1e-5]; NSNumber *longitude = [[NSNumber alloc] initWithFloat:lng * 1e-5];
        CLLocation *location = [[CLLocation alloc] initWithLatitude: [latitude floatValue] longitude:[longitude floatValue]];
        [array addObject:location]; }
    return array;
}

我在 google sdk 上遇到了类似的性能问题,它对我有用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GMSPolyline 非常大的内存峰值 的相关文章

  • 编程环境中的虚拟地址空间

    我对虚拟地址空间的含义感到困惑 在 32 位机器中 进程可以寻址 2 32 个内存位置 这是否意味着每个进程的虚拟地址空间是 2 32 4GB 以下是进程虚拟地址空间的快照 这个可以增长到4GB吗 这样的系统中进程数量有限制吗 这个可以增长
  • 在 Postgres 中为特定查询设置 work_mem

    我正在使用一个委托给 JDBC 驱动程序的库PostgreSQL 而且有些查询非常复杂 需要更多内存 我不想设置work mem对于所有查询来说都是大的 只是这个子集 问题是执行以下代码会导致错误 pseudo code for what
  • Android - 有没有办法监听 GPS 是否启用或禁用

    我编写此代码是为了接收位置更新 PendingIntent launchIntent PendingIntent getBroadcast context 5000 intent 0 manager requestLocationUpdat
  • Python:当为变量分配新内容时,“旧”内存是否被释放?

    如果为变量分配了任何新内容 为 旧内容 分配的内存是否会 正确 释放 例如 在以下脚本中 在为 a 分配一些新内容后 变量 a 作为零数组的内存是否会被释放 import numpy a numpy zeros 1000 a a 1 我想象
  • 如何从内存转储中查找预加载系统绘图(位图)的 ID 或名称

    我正在分析我们应用程序的内存使用情况 发现很奇怪Drawables 它不断地 吃掉 几兆字节的堆 以下是一些截图MAT http www eclipse org mat Dominator tree with 2 pretty big bi
  • 以编程方式激活 GPS

    我的应用程序需要打开 GPS 有什么方法可以检查 GPS 当前是否启用 如果没有 那么如何启用 我使用的是安卓2 3 Android 不允许你这样做 您能做的最好的事情就是检查 GPS 是否已启用 如果未启用 请要求用户激活它 您可以在此处
  • 有没有办法让这个哈希查找更快?

    我需要 非常 快速处理有限范围的字符串 计算它们的值 输入文件的形式为 January 7 March 22 September 87 March 36 等等 因为线宽相同 所以我可以简单地读取一行fread相当快 而且我已经开发了一个完美
  • 可以通过Data.Function.fix来表达变形吗?

    我有这个可爱的fixana这里的函数执行速度比她的姐妹快 5 倍左右ana 我有一个criterion报告支持我这一点 ana alg Fix fmap ana alg alg fixana alg fix f gt Fix fmap f
  • 跨 dll 边界的内存分配和释放

    我知道在一个 dll 中进行内存分配然后在另一个 dll 中释放内存可能会导致各种问题 尤其是与 CRT 相关的问题 当涉及到导出 STL 容器时 此类问题尤其成问题 我们之前遇到过此类问题 在编写与我们的库链接的自定义 Adob e 插件
  • 在 Swift 中,当使用“[weak self] in”时,当嵌套在另一个闭包中时我是否应该加倍它[重复]

    这个问题在这里已经有答案了 在 Swift 中 当使用 weak self in 当嵌套在另一个闭包中时 我应该将其加倍吗 Example override func viewDidLoad super viewDidLoad makeAP
  • 如何获取常量内存中的统计数据

    我有一个函数 它会创建一些随机的数值结果 我知道 结果将是 a 小 a b 约 50 范围内的整数a b 我想创建一个执行上述函数 1000000 次的函数 并计算每个结果出现的频率 该函数使用随机生成器来生成结果 问题是 我不知道如何在常
  • Android 7.0+ 屏幕关闭时前台服务无法接收位置更新

    我正在尝试创建一个 Android 应用程序 在设备屏幕关闭时连续实时记录设备位置数据 我的代码可以在 Android 6 0 及更早版本中正常运行 但 Android 7 0 似乎会破坏我的应用程序 我已经实现了一个 Android 前台
  • lmfit 最小化失败并出现 ValueError:数组太大

    我正在尝试使用 暴力 方法来最小化 20 个变量的函数 它因神秘错误而失败 这是完整的代码 import random import numpy as np import lmfit def progress update params i
  • 反序列化 XML 文件而不将其全部加载到内存中 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 假设您的应用程序使用 XmlSerializer 序列化对象 当应用程序的另一部分 例如外部服务或另一个组件 处理该 XML 文件时 会返回一个
  • 将值存储为变量或再次调用方法更好吗?

    最近 我开始学习一些Java 从我对 JVM 的了解来看 JIT 使其在需要 CPU 周期的操作 即调用方法 上变得非常快 但也使其对内存产生了饥饿感 因此 当我需要与以前相同的方法获得相同的输出时 将之前的输出存储在变量中并再次使用它 同
  • 查找附近应用程序的用户(iPhone 和 Android)

    我正在开发一个有 iPhone 版本和 Android 版本的应用程序 我的目标是 显示我的应用程序的附近用户列表 iPhone 应用程序用户和 Android 应用程序用户 假设列出当前在 1 英里或 2 英里半径内并且当前正在使用我的应
  • 计算 [1..N] 中前导 1 下面有 K 个零位的整数? (没有 HW POPCNT 的连续范围的 popcount)

    I have following task Count how many numbers between 1 and N will have exactly K zero non leading bits e g 710 1112 will
  • 删除指向对象的 C++ 指针

    我认为删除命令会释放我分配的内存 有人可以解释为什么删除后我似乎仍然有内存在使用吗 class Test public int time int main Test e e new Test e gt time 1 cout lt lt e
  • gcc 没有小字符串优化吗?

    Most std string实现 包括 GCC 使用小字符串优化 例如 有一个answer https stackoverflow com a 21710033 2640636讨论这个 今天 我决定检查我编译的代码中的字符串在什么时候被移
  • 同一索引操作上的不同估计行?

    简介和背景 我必须优化一个简单的查询 下面的示例 重写几次后 我认识到同一个索引操作的估计行数会根据查询的编写方式而有所不同 最初 该查询执行了聚集索引扫描 因为生产中的表包含二进制列 该表相当大 大约 100 GB 并且全表扫描执行起来需

随机推荐

  • Homebrew 给出错误 SDK 未找到 (MacOS 11/10.16)

    我试图用 Brew 安装公式 但我总是收到一个错误 Error Could not find an SDK that supports macOS 11 0 You may have have an outdated or incompat
  • gdb:调试 VS 代码时数组中<错误读取变量>

    我在调试期间尝试查看数组的内容时遇到问题 我看到的不是字符 My code include
  • openssl,python 请求错误:“证书验证失败”

    如果我从我的开发箱运行以下命令 openssl s client connect github com 443 我得到以下最后一行输出 Verify return code 20 unable to get local issuer cer
  • 简单的表单无法验证

    我在 stackoverflow 上找到了一种使用信号扩展 django 内置身份验证的方法 我的基本用户由 电子邮件 和密码定义 因此那里没有用户名 所以我试图根据我的需要修改它 但我的表单出现验证错误 奇怪的是 错误连接到 User e
  • 在 CSS 中使用百分比大小和填充时无法防止嵌套 Div 溢出吗?

    我希望能够使用这些属性来布局嵌套 div width 100 height 100 padding 10px 我希望子元素的宽度和高度是 100 其余的 space after填充是计算出来的 而不是之前计算的 否则 当我有如下例所示的文档
  • Laravel base_path() 给出错误 - 调用未定义的方法 baseDir()

    我有一个测试类 我正在尝试使用全局帮助器方法base path 但我收到以下错误 Error Call to undefined method Illuminate Container Container basePath myprojec
  • AWS API Gateway:使用 302 重定向和 set-cookie 标头

    我使用 AWS API Gateway 进行重定向作为响应 简单流程 aaa com gt API 网关和 Lambda 302 重定向 gt bbb com 跟随时效果很好the blog https rpgreen wordpress
  • 将 JSON 数据从 Android 发送到 PHP 并写入文本文件

    我正在尝试获取在 Android 设备上动态创建的特定 JSON 文件 并使用 HTTP post 请求将该数据发送到 PHP 脚本 以存储到文本文件中以供以后使用 最终我还需要将数据保存在 MySQL 数据库中 但我一次一步地工作 JSO
  • 如何禁用“提交”按钮?

    如何在表单有效之前禁用 提交 按钮 angular2 是否有相当于 ng disabled 的功能 可以在 提交 按钮上使用 ng disabled 对我不起作用 正如这个 Angular 中所见example https github c
  • “签名无效,代码对象根本没有签名”错误

    我已经浏览 Stack 几个小时试图尝试修复这个错误 并且我已经尝试了我能找到 想到的一切 我正在向 App Store 提交现有应用程序的更新 在提交我的版本后 我不断收到此错误 签名无效 代码对象根本没有签名 确保你 已使用分发证书而不
  • 在 Kubernetes pod 中克隆安全的 git 存储库

    我遇到了一个有趣的情况 我需要将私有 github 存储库克隆到我在 Kubernetes 中运行的 Docker 容器中 最初我尝试使用 gitRepo 安装 但是 在我的部署清单中包含 OAuth 密钥是不可接受的 我想使用存储库部署密
  • 避免循环后重复代码?

    使用循环时 我经常会编写两次代码 例如 在复习 Udacity 计算机科学课程时 我编写了代码 用于查找最连续重复的元素的函数 def longest repetition l if not l return None most reps
  • 如何在 Mailjet v3 PHP 包装器中获取联系人 ID?

    我使用 Mailjet api 将提交的电子邮件存储在 Mailjet 列表中 当有 Mailjet 0 1 版本 API 时 这可以正常工作 当时没有任何 PHP 包装器 但很容易使用他们的示例 但是当他们将 API 更改为版本 3 时
  • 使用 ruby​​、python、perl、java 或其他方式对 Google 进行脚本驱动的自动化优化

    背景 同事 Adam 在过去一年左右的时间里一直在使用 Google Refine 来处理数据库下载 并取得了巨大成功 但 Adam 获得了新的工作机会 因此他在 Google Refine 中所做的所有工作和专业知识都将消失 Ben 希望
  • 是否可以将 OpenMP 库与 Android NDK 一起使用?

    是否可以将 OpenMP 库与 Android NDK 一起使用 也许有人已经尝试将它们编译在一起并可以提供一些提示 随着双核平板电脑 智能手机的出现 我认为在应用程序开发中使用 OpenMP 功能会非常好 先感谢您 对于现在遇到这个问题的
  • 导入错误:“图标”未从“antd”导出

    我创建了一个 React 应用程序 并且正在使用 Ant Design antd 在我的一个项目文件中 我想使用该标签 但我不能 显然这是 ANT V4 上的问题 我正在使用以下导入语句 import Icon from antd 并收到以
  • d3.js 在非 svg 元素上强制布局

    d3 js layout force 可以用于 重新 定位 div 等 svg 元素吗 如果 div 有position absolute maybe left and top可以用作等效项x1 and y1用于 svg 元素的属性 目标是
  • 如何将子节点从一个节点复制到另一个节点?

    情况 我需要下载 childNode 然后将其 set 到另一个节点中 问题是我只想在 childNode 的 Score 属性达到 100 时才执行此操作 我应该在何时何地检查帖子的分数是否为 100 或更高 以及如何将它们复制到新索引一
  • jQuery 选择器 jQuery("element") 和 $("element") 有什么区别?

    我以前多次使用过 jQuery 但总是这样使用 document 最近我多次看到有人使用jQuery document 我不知道它们之间的区别 我认为它们是相同的 但我现在有一个非常困难的问题 你知道 jQuery 插件的大部分用途 doc
  • GMSPolyline 非常大的内存峰值

    在允许用户在各种不同类型的地图上显示我们称之为轨迹的复杂位置点列表的 GPS 应用程序中 每个轨迹可以包含 2k 到 10k 个位置点 当轨迹在非 Google 地图类型上呈现时 它们会被大量剪切 修剪和路径简化 这是为了降低内存使用量并提