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 非常大的内存峰值 的相关文章

  • 如何使用Python优化大型数据集的API调用?

    客观的 将地址列表发送到 API 并提取某些信息 例如 指示地址是否位于洪水区域的标志 Solution 适用于小数据的 Python 脚本 Problem 我想针对大输入优化当前的解决方案 如何提高 API 调用的性能 如果我有 100
  • CUDA 常量内存是否应该被均匀地访问?

    我的 CUDA 应用程序的恒定内存小于 8KB 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 如果是 如何确保所有线程同时访问同一地址 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 是的 这缓存本身每
  • 卸载屏幕外的 UIImageView 图像

    我正在 Ipad 上编写一个应用程序 在我的应用程序的某个时刻 我使用presentModalViewController 呈现一个ViewController 我的 ViewController 是一个 UISScrollView 它采用
  • 如何通过点积获得峰值 CPU 性能?

    Problem 我一直在研究 HPC 特别是使用矩阵乘法作为我的项目 请参阅我的个人资料中的其他帖子 我在这些方面取得了不错的成绩 但还不够好 我退后一步 看看我在点积计算方面能做得如何 点积与矩阵乘法 点积更简单 并且允许我测试 HPC
  • Java Marine API - 寻找 NMEA 数据

    我的最终目标是从 Adafruit Ultimate GPS NMEA 0183 标准 接收纬度和经度 GPS 信息到我的 Java 应用程序 我正在使用 Java Marine API 来执行此操作 然后 当前位置将与时间戳一起写入数据库
  • 为什么 SSE 对齐读取 + 随机播放在某些 CPU 上比未对齐读取慢,而在其他 CPU 上则不然?

    在尝试优化有限差分代码所需的未对齐读取时 我更改了未对齐的负载 如下所示 m128 pm1 mm loadu ps H k 1 进入这个对齐的读取 随机播放代码 m128 p0 mm load ps H k m128 pm4 mm load
  • SQL Server在查询执行后不释放内存

    我想我在这里有一个很多人可能遇到过的基本问题 当我在 SQL Server 中运行查询时 它将在内存中加载查询执行所需的所有数据 例如 如果存在联接 那么它将从这两个表加载必要的数据 但是当查询完成执行内存时SQL Server 消耗的数据
  • 不担心“retainCount”吗?真的吗?

    有人告诉我不要担心保留计数 我明白我不应该决定release or retain使用基于条件逻辑retainCount 但我不应该担心吗 我认为这些在某种程度上与内存使用相对应 例如 如果我有一堆子视图UIView我也放入了NSArray能
  • 我的程序有内存泄漏

    IBAction play2 CFBundleRef mainBundle CFBundleGetMainBundle CFURLRef soundFileURLRef soundFileURLRef CFBundleCopyResourc
  • 使用 PuLP 进行线性优化,变量附加条件

    我必须用 Pull 解决 Python 中的整数线性优化问题 我解决了基本问题 现在我必须添加额外的约束 有人可以帮助我用逻辑指示器添加条件吗 逻辑限制是 如果 A gt 20 则 B gt 5 这是我的代码 from pulp impor
  • 查找二维空间中圆内的所有点

    我表示我的 2D 空间 考虑一个窗口 其中每个像素显示为 2D 数组中的一个单元格 即 100x100 的窗口由相同维度的数组表示 现在给定窗口中的一个点 如果我画一个半径的圆r 我想找到该圆圈中的所有点 我想我应该检查半径周围方形区域中的
  • 如何使用 #pragma 在 G++ 中启用优化

    我想在没有命令行参数的情况下启用 g 优化 我知道 GCC 可以通过写来做到这一点 pragma GCC optimize 2 在我的代码中 但它似乎在 G 中不起作用 此页面可能有帮助 http gcc gnu org onlinedoc
  • scipy-optimize-minimize 不执行优化 - CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL

    我试图最小化定义如下的函数 utility decision decision risk cost 其中变量采用以下形式 决策 二进制数组 风险 浮点数数组 成本 常数 我知道解决方案将采取以下形式 决定 1如果 风险 gt 阈值 决定 0
  • 我什么时候应该从正在观察持久模型类的正在关闭的 ViewController 类中调用removeObserver:forKeyPath?

    我有一个ViewController具有一个属性的类 该属性是我想要观察模型属性变化的模型 在我的模型对象中 我有一个在应用程序后台定期更新的属性 当它更新时 我需要在我的内部执行代码ViewController 为此 我从我的模型中创建了
  • 当我打开在 Xcode 4 中创建的 Google 地图项目时,Xcode 5 会警告我的架构设置

    我刚刚更新到新发布的 Xcode 5 我正在开发一个使用 Google 地图 iOS SDK 的 iOS 应用程序 当我在 Xcode 4 中开发时 我改变了我的Architectures在我的项目设置中进行设置 按照 Google 的步骤
  • laravel 基本查询中“允许的内存大小已耗尽 134217728 字节”

    我不知道为什么我无法让以下工作正常工作 DB table twitter hashtags gt paginate 5 每次我得到 第二个数字往往不同 Allowed memory size of 134217728 bytes exhau
  • 如何在 Windows 7 中模拟内存不足的情况

    我有一个用 C 编写的应用程序 运行良好 但有时在现场会出现错误 我们认为这些错误是由于内存不足或与垃圾收集器的交互造成的 如果有人感兴趣 这里有描述 无法将 NHibernate Impl ExpandedQueryExpression
  • 页面错误陷阱的成本

    我有一个应用程序 它定期 每 1 或 2 秒后 通过分叉自身来获取检查点 因此 检查点是原始进程的一个分支 它一直保持空闲状态 直到原始进程发生某些错误时被要求启动 现在我的问题是fork的写时复制机制的成本有多大 每当原始进程写入内存页面
  • 快速分类(分箱)

    我有大量条目 每个条目都是浮点数 这些数据x可以通过迭代器访问 我需要使用像这样的选择对所有条目进行分类10
  • PWA 可以访问联系人、GPS 或使用手机摄像头吗?

    PWA 可以访问联系人 GPS 或使用手机摄像头吗 这在任何系统 ios android 中都可能吗 是否有任何开发计划来实现这些功能 PWA 无法克服一些限制 you cannot访问电话上的联系人列表 另一方面 你can拍照并使用 GP

随机推荐

  • 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 地图类型上呈现时 它们会被大量剪切 修剪和路径简化 这是为了降低内存使用量并提