我正在与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);
}
}
我所知道的IOSurface
:它来自以前的私有框架IOSurface
。
CIContext
有一个功能render: ... toIOSurface:
。
我已经创建了 myIOSurfaceRef
并将其传递给了这个函数,内部实现仍然创建了自己的表面,并且不清理它。
那么,您是否知道(或假设): 1. 除了/
之外,还有其他方法可以读取 CGImage 的数据缓冲区
吗?
2. 有没有办法在渲染时禁用缓存?
3. 为什么会发生缓存?
4. 我可以使用一些较低级别的(非私有的)API 来手动清理系统内存吗?CGContextDrawImage
CGDataProviderCopyData
欢迎任何建议。