Какие ресурсы использует Core Graphics (Quartz 2D)?

«Какие ресурсы использует Core Graphics (Quartz 2D)?» — вопрос из категории UIKit, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Core Graphics — это низкоуровневый C-API для векторного и растрового рисования. В отличие от Core Animation, он в основном загружает CPU, а GPU используется выборочно.

Распределение ресурсов:

  1. CPU (Основная нагрузка):

    • Выполнение всех команд рисования (линии, кривые, заливки).
    • Растеризация векторных путей (path) в пиксели.
    • Управление цветовыми пространствами и трансформациями.
  2. GPU (Вспомогательная роль):

    • Некоторые операции могут быть ускорены (например, простые заливки, масштабирование bitmap), но это зависит от устройства и контекста.
    • Финализация и передача готового bitmap в системный композитор для отображения.
  3. RAM (Память):

    • Основное потребление. Core Graphics работает с bitmap-буферами в оперативной памяти.
    • Размер буфера = width * height * bytesPerPixel. Изображение 1000x1000 в RGBA займет ~4 МБ.

Практический пример с выделением памяти:

// 1. Выделение bitmap-буфера в RAM
let size = CGSize(width: 1000, height: 1000)
UIGraphicsBeginImageContextWithOptions(size, false, 0.0) // ~4 МБ RAM

defer { UIGraphicsEndImageContext() } // Важно: освободить память

// 2. Получение контекста для рисования (операции на CPU)
guard let context = UIGraphicsGetCurrentContext() else { return }

// Рисование красного круга (вычисления на CPU)
context.setFillColor(UIColor.red.cgColor)
context.fillEllipse(in: CGRect(x: 250, y: 250, width: 500, height: 500))

// 3. Создание UIImage из буфера
let renderedImage = UIGraphicsGetImageFromCurrentImageContext()
// `renderedImage` теперь содержит сжатые данные bitmap

Ключевой вывод: Core Graphics — это CPU-intensive фреймворк. Для интенсивного рисования в реальном времени (например, графики в играх) используйте Metal или SpriteKit, которые переносят всю работу на GPU.