iPhone + UIView。绘制矩形期间消耗大量内存。有什么策略可以减少这种情况吗?

2024-01-11

我的数据可视化应用程序在重绘(触发drawRect的setNeedsDisplay)期间产生大量内存消耗峰值。我目前正在重新绘制包含数据图的整个视图。该视图比设备显示屏大得多。

有没有办法告诉 CoreGraphics 分配足够的内存来绘制每个元素(每个元素是一个比设备显示小得多的小矩形块)并在完成后释放内存,而不是我当前的天真的方法?

提前致谢。

-Doug

美国东部时间 12 月 8 日上午 8:28 更新

这是带有解释性文字的相关代码。我正在运行带有 ObjectAlloc、内存监视器和泄漏仪器的仪器。我唯一的内存泄漏是由于 NSOperationQueue 不释放 mems 造成的。这是次要的且不相关的。

从架构上讲,该应用程序由一个 tableView 组成,其中包含人类基因组中要检查的有趣位置的列表。当选择表行时,我将返回称为alignmentData 的数据的数据收集操作排入队列。然后将该数据绘制为水平矩形板。

最初,当 tableView 启动时,我的内存占用量为 5 MB。

- (void)viewWillAppear:(BOOL)animated {

    // Initial dimensions for the alignment view are set here. These
    // dimensions were roughed out in IB.

    frame                       = self.alignmentView.frame;
    frame.origin.x              = 0.0;
    frame.origin.y              = 0.0;  
    frame.size.width            = self.scrollView.contentSize.width;    
    frame.size.height           = 2.0 * (self.containerView.frame.size.height);

}

注意:调用viewWillAppear:之后内存占用并没有变化。即使alignmentView的大小远远超出了显示器的尺寸。

这是数据收集操作调用的方法。

- (void)didFinishRetrievingAlignmentData:(NSDictionary *)results {

        // Data retrieved from the data server via the data gathering operation
    NSMutableData *alignmentData = [[results objectForKey:@"alignmentData"] retain];

    NSMutableArray *alignments = [[NSMutableArray alloc] init];
    while (offset < [alignmentData length]) {

        // ...
        // Ingest alignmentData in alignments array 
        // ...  

    } // while (offset < [alignmentData length])    
    [alignmentData release];

    // Take the array of alignment objects and position them in screen space 
        // so that they pack densely creating horizontal rows of alignment objects 
        // in the process.
    self.alignmentView.packedAlignmentRows = 
    [Alignment packAlignments:alignments basepairStart:self.startBasepairValue basepairEnd:self.endBasepairValue];  
    [alignments release];

    [self.alignmentView setNeedsDisplay];

}

这行代码之后:

self.alignmentView.packedAlignmentRows = ...

内存占用为 13.8 MB

这行代码之后:

[self.alignmentView setNeedsDisplay];

内存占用量激增至 21.5 MB,并停留几秒钟,然后返回到先前存在的 13.8 MB 水平

我正在寻找的解决方案本质上允许我创建一个水平渲染缓冲区窗口,它是单行对齐对象的高度。我会将其内存渲染分配给它,然后丢弃它。我会对每一行对齐数据一遍又一遍地执行此操作。

理论上,我可以用这种方法呈现无限量的数据,这当然是最优秀的;-)。

-Doug


这是对我的记忆问题的不太明显的答案。我会给自己这个,因为我是从 Rincewind 的 Apple 开发论坛上学到的,Rincewind 是一位非常乐于助人的 Apple 工程师。

事实证明,通过将大视图分割成 N 个小块并依次渲染每个小块,我将产生大约是大视图大小的 1/N 的内存峰值。

因此,对于每个较小的视图:alloc/init,提供我的数据的一部分,setNeedsDisplay。对所有 N 个小视图进行冲洗/重复。

很简单,嗯?

在学习这一点之前,我错误地认为 setNeedsDisplay:myRect 是为大视图执行此操作的。显然不是。

感谢大家的建议。

干杯, 道格 @杜格拉

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

iPhone + UIView。绘制矩形期间消耗大量内存。有什么策略可以减少这种情况吗? 的相关文章

  • 如何使用编译时间作为自动版本控制信息?

    当程序被编译以获得一种自动版本信息时 是否有任何常量或 pragma来获取时间和日期 DATE and TIME 是预定义的宏 将分别扩展到当前日期和时间
  • Xcode 找不到我的静态库!

    这是链接器错误 i686 apple darwin10 gcc 4 2 1 Users william Documents SettingsLibrary build Debug iphonesimulator libSettingsLib
  • 在 swift 中从本地视频创建缩略图

    如何从本地视频文件快速创建缩略图 例如 如果视频文件路径位于此处 file Users Dev Library Developer CoreSimulator Devices F33222DF D8F0 448B A127 C5B03C64
  • cocos2d 2.0-rc2:结束director并重新启动

    我有一款由 cocos2d 驱动的游戏 它使用 UIKit 菜单 所以我只使用一个视图控制器的框架 即游戏本身 而且 它只有一个场景 从cocos2d 2 0开始 director本身就是一个UIViewController子类 所以我只是
  • 强制向扬声器发出音频警报

    我有一个小应用程序 在此应用程序中 扬声器每隔我设置的特定时间就会发出噪音 现在 我希望即使设备中插入了耳机插孔 它也能通过内置扬声器发出噪音 我怎样才能做到这一点 您可以尝试以下代码在扬声器上播放代码 另请检查this http uiha
  • 如何在 UI 视图上显示两个表

    我想在 UI 视图上使用和显示两个表 请让我知道如何执行此操作 任何相同的代码也将受到赞赏 谢谢 桑迪普 将 2 个 UITableView 添加到 IB 中的视图中 并将它们连接到文件所有者中的 2 个不同的出口 或者简单地分配不同的标签
  • UIView 和 UITableView 中的 UITapGestureRecognizer 冲突

    我有一个UIView我在其中添加了一个UITapGestureRecognizer 在该视图中 我还有一个子视图 其中基本上是某种UITableView 问题是为什么不UITableView识别连续点击 而是始终转到点击手势识别器的处理程序
  • 如何通过我的 ios 应用程序的指示打开苹果地图应用程序

    我的目标是从 ios 应用程序打开带有方向的地图应用程序 我可以打开地图应用程序 但它没有显示方向 我编写的代码如下 NSString mystr NSString alloc initWithFormat http maps apple
  • iPhone OS 3.0.1 会毁掉你的开发手机吗?

    我将手机更新到3 0 1 虽然手机作为手机工作正常 xcode http en wikipedia org wiki Xcode组织者不再知道手机的名称 它还说这个版本的 xcode 不支持 3 0 1 我下载了最新版本的xcode和操作系
  • Mobile Safari (iPhone) CSS 垂直居中/行高 CSS 问题

    有一个问题 我一直试图在各个项目中解决 但运气不佳 我有一些divs 内的文本以 CSS 为中心 使用display block and line height 我也尝试过padding和固定的高度 通常 这些设置要么只是标题 要么有时是按
  • [[NSMutableDictionary alloc] initWithObjects:...] 和 [NSMutableDictionary DictionaryWithObjects:...] 之间的区别?

    仍在学习 Objective C iPhone SDK 我想我知道为什么这不起作用 但我只是想确认一下 In awakeFromNib 如果我使用 NSMutableDictionary alloc initWithObjects 它实际上
  • 如何在iphone APP中下载facebook和Picasso的图片

    任何人告诉我有关 iphone 中从 facebook 和 picassa 下载图像的功能 我正在其中制作应用程序 我想制作通过我的应用程序从 picassa 和 facebook 下载选定图像的功能 那么我必须做什么 谢谢 查看NSURL
  • 将滚动事件从 uibutton 传递到 uiscrollview

    我有水平的UIScrollView这是从UIScrollView我添加了UIButtons水平地 我只能滚动到按钮区域之外 但如果我想滚动到任何按钮就会触发UIControlEventTouchUpInside事件 我不想要这个 我想开火U
  • Swift 中的 quitFirstResponder

    我怎样才能用Apple的新语言实现它 Objective C 代码 void touchesBegan NSSet touches withEvent UIEvent event for UIView view in self view s
  • iPhone AVFoundation 相机方向

    我一直在绞尽脑汁地试图让 AVFoundation 相机以正确的方向 即设备方向 捕获图片 但我无法让它工作 我看过教程 看过 WWDC 演示 还下载了 WWDC 示例程序 但即使这样也没有成功 我的应用程序的代码是 AVCaptureCo
  • skView.ignoreSiblingOrder 在 swift 中的重要性/效率?

    这样做有多重要 高效skView ignoreSiblingOrder true初始化场景时 现在 我将其设置为 true 但由于某种原因 当我从 MainMenu 场景启动 GameScene 时 它 会在我的角色之前加载背景 即使背景的
  • iPad 横向触摸开始变得混乱

    我的应用程序仅允许在横向方向上使用 并且它以横向方式启动 因此 iPad 横向时左上角为 0 0 因此一切正常 但是 当我拿起 touchesBegan 时 它无法正常工作 只有当我点击 iPad 的右侧三分之二时 它才会接收到触摸 我知道
  • 如何将 UIImageView 裁剪为自定义形状

    用户是否可以在该位周围画一条虚线 圆圈 UIImageView他们希望裁剪到 然后为UIImageView调整大小到这些点 这有点像 Photoshop 中的套索 选取框效果 更新 从 iOS 8 x 开始 UIImageView 提供了m
  • Objective C (iphone) 关于发布的问题

    如果我创建一个视图 并将其添加为子视图并将其添加到数组中 是否必须释放它两次 UIView cat UIView alloc initWithFrame someFrame self view addSubview cat self ani
  • 选择 UITableViewCell 时 UIView 背景颜色消失

    我在界面生成器中构建了一个简单的 tableViewCell 它包含一个包含图像的 UIView 现在 当我选择单元格时 会显示默认的蓝色选择背景 但 UIView 的背景颜色消失了 我的 UITableViewCell 的实现文件没有做任

随机推荐

  • 如何向用户实施有限的功能推出(与语言无关)?

    我想知道向选定的用户群推出新网站功能的一些常见或最佳实践 例如 用户可以仅基于总体用户群的百分比 10 部署应该是可定制的 可配置的 并支持任意数量的功能 将部署与特定用户角色或权限 ACL 相关联也很有用 那么 从本质上讲 什么是能够很好
  • @font-face 不起作用

    我下载了一个字体inlove light wf ttf 为了使用该规则 font face 我的文件夹中有 home html and inlove light wf ttf 在我的 CSS 中我有 font face font famil
  • 如何测试“Mosquitto”服务器?

    我是新来的Mosquitto and MQTT 我下载了Mosquitto服务器库 但我不知道如何测试它 有什么办法可以测试一下Mosquitto server 在单独的终端窗口中执行以下操作 启动代理 mosquitto 启动命令行订阅者
  • 我可以将实体字段名称映射到 TypeORM 中的别名列名称吗?

    我正在使用 TypeORM 从 Rails 迁移到 NestJs 由于历史原因 Rails 中的表名和列名是snaked cased 我不想将这种麻烦复制到我们的 NestJs React 端 我可以在 NestJS typeorm 中创建
  • 使用新范围更新 Google 工作表“过滤器视图”

    我有一个电子表格 其中设置了各种过滤器视图 通常这很有效 但偶尔会添加新行 我必须手动更新每个过滤器视图中的范围 我尝试在线搜索解决方案 并提出了以下可能更新范围的代码 function UpdateFilterView var dataS
  • xcode4 工作区中的两个项目(#import 失败)

    我真的很难让它在 xcode 4 中工作 我有一个项目将在许多应用程序 网络 中重用 因此我创建一个工作区并添加我的两个项目 到目前为止 一切都很好 这就是失败的地方 import JSONRequest h 没有明显的原因 它自动完成头文
  • 在单个表列中存储多个位值

    我需要在数据库中存储某种一周中的日程安排 我可以在其中安排一周中的一天或多天的记录 假设它代表一个任务 我需要将其存储在一列中 以便于保存和检索 然后每天我都会选择时间表与本周的当前日期相匹配的记录 例如 获取时间表与第 7 周的日期相匹配
  • 内部矩阵尺寸必须一致

    我有一个矩阵A和一个向量x A是一个 50x30 矩阵 x是一个 1x30 向量 我想要倍增A by x 但每当我尝试z A x我收到错误Inner matrix dimensions must agree 然而 在列数相同的情况下 矩阵维
  • Elasticsearch Painless 计算嵌套元素的分数

    Note 我最初发布这个问题的方式有点不同 不值得更新 因为阅读后我学到了更多 要求 搜索文档并根据文档中的嵌套元素计算自定义分数 结构 mappings book properties title type string index no
  • 使用 gdb 中的函数调用堆栈进行导航

    在 Visual Studio 中 如果单击调用堆栈中的某个条目 则会打开编辑器并显示该函数的源代码 gdb 中可能有类似的东西吗 我在 gdb 中使用 tui 文本用户界面 是否可以让 tui 显示回溯中给定条目的源代码 如果没有 那么如
  • 如何在较新版本的 VS 中通过 UI 更改单元测试属性?

    几个月前 当我在使用 MSTest 进行单元测试时阅读有关数据源的内容时 我偶然发现了一些旧帖子 声称这只是进入属性并在 gui 上设置数据源的问题 这导致该属性与所需的参数一起自动添加到测试方法中 不过 我始终无法在属性网格上选择单元测试
  • 如何检查是否已为 VIRTUALENVWRAPPER_PYTHON=/usr/bin/python 等安装 virtualenvwrapper

    我正在遵循有关 Python 的 virtualenv 的指南 但遇到了一个小问题 Sahands MBP empty sahandzarrinkoub source usr local bin virtualenvwrapper sh u
  • 删除结构 C++ 向量中的重复项

    我有以下结构 我想将结构存储在向量中 其次我想删除 context 我究竟做错了什么 include
  • 编译器使用了错误的函数原型?

    我遇到了一个我不明白的编译问题 我将其简化了一些 以便在下面进行解释 基本上 它涉及到有 2 个不同的 getter 一个 const 和一个非常量 getter 它们返回一个带有 const 和非常量 value type 的容器 本例中
  • 通过命令行的Windows照片查看器 - 特殊功能[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想通过命令行执行在 Windows 7 和 Windows XP 下使用 Windows 照片查看器查
  • 使用 VBA 从工作簿中检索 OLEObjects 信息

    设想 我正在尝试使用 VBA 最初是 Python 但我找不到方法来执行此操作 读取所有信息或工作表 由于我必须读取的工作表具有不同的格式并且通常很混乱 因此我循环遍历工作表中的所有对象 获取它们的名称和值 检查或不检查 作为二进制文件 I
  • 为嵌套循环声明虚拟变量的更好方法是什么?

    方法 1 的优点是由于源代码中的文本字符较少 因此文件大小稍小 int i j for i 0 i lt numRows i for j 0 j lt numCols j
  • NSImage vs. CIImage vs. CGImage?

    我应该什么时候使用它们 NSImage 是一种抽象数据类型 可以表示许多不同类型的图像 以及图像的多种表示形式 当图像的实际类型对于您想要执行的操作并不重要时 它通常很有用 它也是 AppKit 在其 API NSImageView 等 中
  • Discord 机器人:如何在语音通道中播放 mp3 文件

    我为粉丝服务器制作了一个自定义的 Discord 机器人 该服务器由 Heroku 托管 因此当我不在时它可以保持在线状态 我想做的是 当有人为其发出特定命令时 让机器人播放其文件夹中的 mp3 文件 但我希望音乐在特定语音通道中播放 首先
  • iPhone + UIView。绘制矩形期间消耗大量内存。有什么策略可以减少这种情况吗?

    我的数据可视化应用程序在重绘 触发drawRect的setNeedsDisplay 期间产生大量内存消耗峰值 我目前正在重新绘制包含数据图的整个视图 该视图比设备显示屏大得多 有没有办法告诉 CoreGraphics 分配足够的内存来绘制每