Sup*_*NES 5 memory cocoa-touch core-animation objective-c calayer
我有一个独特的问题CoreGraphics/ CoreAnimationiPhone上.为了更好地解释问题是如何表现出来的,我将引导您完成当前的设置,并在适当的情况下使用代码进行说明.
我想画一堆预载图片的UIView的CALayer,但每当图像显示,应用程序的内存使用率峰值和内存不回收每当图像变化.
图像的预加载是通过读取它们UIImage的设施,将它们渲染到位图上下文并从中提取CGImageRef出来的.这样做的目的是对图像进行解压缩和缩放,以便在每次绘制时都不会发生这些操作.关于此事的Apple Q&A中也可以找到类似的建议(CGContextDrawImage如果您感到好奇,请搜索性能).上下文设置为每个组件8位和预乘alpha.
在将图像解压缩成位图之后,它们被存储在a中NSArray并且稍后被分配(不保留)到UIView执行绘图的自定义子类.我已经尝试了各种方法来实际绘制图像,到目前为止,最快的方法是直接设置视图的CALayer contents属性.其他方法例如drawLayer:inContext:并且drawRect:对帧速率有不同的影响,但它们都表现出相同的记忆行为.
问题是......在contents属性改变之后,我看到Instruments中的内存出现峰值,即使图像不再显示,内存也不会下降.对象分配保持不变,所以我唯一的猜测CoreAnimation是创建一些隐式缓存来加速绘图.然而,正如我所说的那样,缓存并没有在它应该发布的情况下释放,而逐渐的构建只会在运行几分钟后导致崩溃.
该contents属性保留了该对象,我没有明确释放它,因为我希望原始图像在应用程序执行期间保留在内存中; 最重要的是,高保留计数不能解释我看到的内存峰值.
在检查堆栈时,我看到它CoreAnimation会调用诸如此类的函数CA::Render::copy_image,这使我相信它会将图层的内容复制到某个无法触及的位置.我想这是有正当理由的,但不知道如何以及何时清除它目前是一个停止显示的错误.
任何对CA有错综复杂知识的人都可以向我解释我是否做错了什么以及如何解决这个问题.
谢谢.
@ CouchDeveloper - 感谢您抽出宝贵时间作出回应.
我做了一些进一步的挖掘,我会回答我自己的问题,而不是直接回复,也许我获得的洞察力将帮助其他人有类似的问题.
您对分配与内存使用情况的观察是正确的.我正在查看的内存是应用程序在内存监视器(活动监视器)仪器中使用的"真实"(驻留)内存.
我想我已经发现了这些神秘内存分配的原因.当CoreAnimation遇到不是原始像素格式的图像时,它会将图像复制到自己的缓冲区中,这似乎是我看到的用法.我认为正确的格式是32位,主机字节顺序,预乘alpha首先(位图信息标志kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host).
为了找出正在复制的CGImageRef实例并更深入地了解框架的内部工作,您可以在设备上使用Core Animation工具,或者指定一些环境变量并从命令行启动iPhone模拟器.可以在此处找到所有标志的列表.在我的例子中,最有用的组合是CA_COLOR_COPY和CA_LOG_IMAGE_COPIES,它将为复制的图像提供青色覆盖并将日志副本提供给stderr.
我仍然有一些奇怪的问题("没有数据指针",非预乘alpha等),但我认为这主要是我创建或传递图像的方式问题,但我想我正在快速通往解决所有内存问题.
希望这可以帮助其他人想知道他们的记忆和性能问题来自哪里!
我正在做你所描述的事情 - 没有检查泄漏。也许当您提供来源时会有帮助。
然而,我确实检查的是,CA分配的系统内存没有记录在仪器的“对象分配”中,而是记录在仪器的“活动监视器”中,分别记录在仪器的“内存监视器”中 - 即“物理内存空闲”。当在屏幕外上下文中绘制图像时,“物理内存空闲”会减少,并且当显示该图像时,“物理内存空闲”也会减少。
在图像被释放之前,内存不会被释放(包括用于显示的内存)(不过,如果知道如何显式释放该内存就太好了)。
在您的情况下,如果您有一个 UIImage 数组作为缓存,则当图像数组被释放并且没有对 UIImage 对象的进一步引用时,应该释放用于该图像的系统内存。
除非您提供来源,否则我怀疑您的 CGImageRefs 保留计数不平衡 - 因此,它们正在泄漏。请注意,CGImageRef 不应直接放入 NSArray 中 - 这些行为不像 Objective-C 对象(又名免费桥接到 UIImage) - 您需要显式调用 CGImageRetain/CGImageRelease。
| 归档时间: |
|
| 查看次数: |
2715 次 |
| 最近记录: |