Olh*_*iuk 5 caching core-graphics core-image ios iosurface
我正在与CGContextDrawImage/CGDataProviderCopyData函数中的内部缓存(15 mp 图像大约 90 MB)作斗争。
这是分析器中的堆栈跟踪:
在所有情况下,IOSurface都是作为“缓存”创建的,并且在@autoreleasepool排空后不会被清除。
这给应用程序留下了极少的生存机会。
缓存并不取决于图像大小:我试图呈现512x512,以及4500x512和4500x2500(全尺寸)图像块。
在清理它们之前@autoreleasepool,我使用,CFGetRetainCount返回1所有CG对象。
操作数据的代码:
+ (void)render11:(CIImage*)ciImage fromRect:(CGRect)roi toBitmap:(unsigned char*)bitmap {
@autoreleasepool
{
int w = CGRectGetWidth(roi), h = CGRectGetHeight(roi);
CIContext* ciContext = [CIContext contextWithOptions:nil];
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef cgContext = CGBitmapContextCreate(bitmap, w, h,
8, w*4, colorSpace,
kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGImageRef cgImage = [ciContext createCGImage:ciImage
fromRect:roi
format:kCIFormatRGBA8
colorSpace:colorSpace
deferred:YES];
CGContextDrawImage(cgContext, CGRectMake(0, 0, w, h), cgImage);
assert( CFGetRetainCount(cgImage) == 1 );
CGColorSpaceRelease(colorSpace);
CGContextRelease(cgContext);
CGImageRelease(cgImage);
}
}
Run Code Online (Sandbox Code Playgroud)
我所知道的IOSurface:它来自以前的私有框架IOSurface。
CIContext有一个功能render: ... toIOSurface:。
我已经创建了我的IOSurfaceRef并将它传递给了这个函数,内部实现仍然创建了它自己的表面,并且没有清理它。
那么,您是否知道(或假设):
1. 除了CGContextDrawImage/之外,还有其他方法可以读取 CGImage 的数据缓冲区
CGDataProviderCopyData吗?
2. 有没有办法在渲染时禁用缓存?
3. 为什么会发生缓存?
4. 我可以使用一些较低级别(非私有)的 API 来手动清理系统内存吗?
欢迎任何建议。
小智 5
回答你的第二个问题,
Is there a way to disable caching at render?
将环境变量设置CI_SURFACE_CACHE_CAPACITY为 0 或多或少会禁用CIContext表面缓存。此外,您可以通过将该变量设置为给定值(以字节为单位)来指定自定义(近似)缓存限制。例如,设置CI_SURFACE_CACHE_CAPACITY为 2147483648 指定 2 GiB 表面缓存限制。
请注意,进程的所有CIContext实例似乎都共享一个表面缓存。每个CIContext.
| 归档时间: |
|
| 查看次数: |
1050 次 |
| 最近记录: |