Нежелательное потребление памяти при вызовах CGImage Draw - PullRequest
0 голосов
/ 17 апреля 2019

Я работаю над проектом, который декодирует изображение в программный буфер RGBA с использованием Core Graphics.

func LoadImage(imageFile: CFString, imageData: inout Array<UInt32>) {
        let imgUrl: CFURL = CFURLCreateWithFileSystemPath(nil, imageFile, CFURLPathStyle.cfurlposixPathStyle, false);
        let imgSource: CGImageSource = CGImageSourceCreateWithURL(imgUrl, nil)!;
        let imgProperties: NSDictionary = CGImageSourceCopyPropertiesAtIndex(imgSource, 0, nil)!;
        let pixelWidth: Int = (imgProperties.object(forKey: kCGImagePropertyPixelWidth) as! NSNumber).intValue;
        let pixelHeight: Int = (imgProperties.object(forKey: kCGImagePropertyPixelHeight) as! NSNumber).intValue;
        let img: CGImage = CGImageSourceCreateImageAtIndex(imgSource, 0, nil)!;
        let colorspace = CGColorSpaceCreateDeviceRGB();

        imageData = Array<UInt32>(repeating: 0x00000000, count: pixelWidth * pixelHeight);

        let ctx: CGContext = CGContext(data: &imageData[0], width: pixelWidth, height: pixelHeight, bitsPerComponent: 8, bytesPerRow: pixelWidth * 4, space: colorspace, bitmapInfo: CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.premultipliedFirst.rawValue)!;

        ctx.draw(img, in: CGRect(x: 0, y: 0, width: pixelWidth, height: pixelHeight));
    }

При вызове этой функции несколько раз (даже с тем же путем к файлу изображения) потребление памятибыстро поднимает.Используя 7600x5066 JPEG, я быстро получаю 2+ ГБ, вызывая его несколько раз с задержкой всего в миллисекунды.Монитор активности показывает увеличение реальной и очищаемой памяти, как только возвращается вызов.И реальная память, и очищаемая память продолжают увеличиваться примерно до 2 ГБ, но, по-видимому, не далее.

Предполагается, что очищаемая память является частью реальной памяти (или виртуальной памяти процесса).Я ожидаю, что система делает то, что говорит «очищаемое», то есть очищает его в данный момент времени.Казалось бы, это происходит потому, что объем никогда не превышал 2 ГБ, а иногда уменьшался до 1,5.

Поскольку сейчас я ограничен 32-битной средой, это очень важно.Есть ли способ предотвратить это дополнительное выделение, которое в конечном итоге будет очищено?Если нет, есть ли способ принудительной очистки?

...