Nano Hash - криптовалюты, майнинг, программирование

Память CGContextDrawImage не освобождается

Я использую проект PhotoScrollerNetwork, чтобы предоставить одно изображение с высоким разрешением для представления в моем проекте и автоматически разбить это, поэтому память управляется правильно. Он использует этот блок кода для отрисовки полного изображения в высоком разрешении в память, чтобы из него можно было вычислить тайлы.

-(void)drawImage:(CGImageRef)image {
       madvise(ims[0].map.addr, ims[0].map.mappedSize - ims[0].map.emptyTileRowSize, MADV_SEQUENTIAL);

       unsigned char *addr = ims[0].map.addr + ims[0].map.col0offset + ims[0].map.row0offset * ims[0].map.bytesPerRow;
       CGContextRef context = CGBitmapContextCreate(addr, ims[0].map.width, ims[0].map.height, bitsPerComponent, ims[0].map.bytesPerRow, colorSpace, kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little);
       assert(context);
       CGContextSetBlendMode(context, kCGBlendModeCopy); // Apple uses this in QA1708
       CGRect rect = CGRectMake(0, 0, ims[0].map.width, ims[0].map.height);
       CGContextDrawImage(context, rect, image);
       CGContextRelease(context);

       madvise(ims[0].map.addr, ims[0].map.mappedSize - ims[0].map.emptyTileRowSize, MADV_FREE);
 }

В методе dealloc класса ims освобождается ( 'free(ims)'), поэтому с этим нужно обращаться правильно. Однако, если я неоднократно создаю новое представление (и, следовательно, вызов drawImage), моя память заполняется. Я обнаружил, что если я прокомментирую CGContextDrawImage(context, rect, image);, с памятью все в порядке, поэтому я думаю, что что-то хранится в памяти, но я не могу понять, что... Всегда вызывается метод Dealloc, так что проблема не в этом.

РЕДАКТИРОВАТЬ: Мое изображение также выпущено правильно, это полный поток:

- (void)myFunc {
        CFDictionaryRef options = [self createOptions];
        CGImageRef image = CGImageSourceCreateImageAtIndex(imageSourcRef, 0, options);
        CFRelease(options);
        CFRelease(imageSourcRef);
        if (image) {
            [self decodeImage:image];
            CGImageRelease(image);
        }
}

- (void)decodeImage:(CGImageRef)image {
    assert(decoder == cgimageDecoder);

    size_t width = CGImageGetWidth(image);
    size_t height = CGImageGetHeight(image);

#if LEVELS_INIT == 0
    zoomLevels = [self zoomLevelsForSize:CGSizeMake(width, height)];
    ims = calloc(zoomLevels, sizeof(imageMemory));
#endif

    [self mapMemoryForIndex:0 width:width height:height];

    [self drawImage:image];
    [self createLevelsAndTile];
}
12.12.2012

  • Почему вы не отправили вопрос по ссылке поддержки github? Очень маловероятно, что кто-то здесь (кроме меня, автора проекта) сможет ответить на ваш вопрос на SO :-). Вероятно, лучше всего взять ваш модифицированный проект, заархивировать его и опубликовать в учетной записи почтового ящика, чтобы я мог на него взглянуть (но это может произойти не раньше этих выходных). 13.12.2012

Ответы:


1

Запустив как локальные образы из пакета, так и сетевые образы, кажется, что любая значительная утечка исчезла. Это с iOS7 и Xcode 5.

04.10.2013
  • У меня есть 12 МБ изображения в формате jpg. Все работает отлично, но CGContextDrawImage (контекст, прямоугольник, изображение); привести к увеличению объема памяти до 360 МБ и аварийному завершению работы приложения. Это из-за Мэдвайс? Любая альтернатива этой функции -(void)drawImage:(CGImageRef)image?? 03.09.2015
  • Что ж, попробуй прокомментировать это и посмотреть. Я не знаю - этот проект работал на оригинальном iPad, который был сильно ограничен в памяти. 03.09.2015
  • Я попытался удалить madvise, но кажется, что CGContextDrawImage внутренне распаковывает весь jpg, поэтому он занимает так много памяти. Я работаю на iPad mini с 500 МБ оперативной памяти. и его сбой. 04.09.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..