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

Ответ

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.

Ответ 18+ 🔞

Да ты посмотри, что за зверь этот Core Graphics! Это ж, блядь, как старый дедовский станок — вручную всё, по старинке. Никаких тебе графических ускорителей на полную катушку, всё на процессор вешают, сука!

Вот смотри, как оно внутри устроено, а то многие думают, что раз «графика», значит сразу видеокарта пыхтит. Хуй там плавал!

Кто тут пашет, как проклятый:

  1. Процессор (CPU) — главный страдалец:

    • Это он, бедолага, все линии вычерчивает, кривые Безье эти ебучие считает, заливки делает.
    • Это он превращает все эти векторные контуры в пиксели — растеризацию делает, блядь!
    • Цвета, преобразования — всё на нём, всё на его горбу. GPU спит себе спокойно в сторонке.
  2. Видеокарта (GPU) — работает по настроению:

    • Иногда, если повезёт и операция простая, может помочь — масштабирование какой-нибудь картинки или примитивную заливку ускорить. Но это не гарантия, ёпта!
    • Основная её работа начинается потом — взять готовую битмап-картинку и сунуть её в дисплей. Почти как курьер, блядь.
  3. Оперативка (RAM) — тут жратва адская:

    • Вот тут-то и собака зарыта! Core Graphics работает с битмапами прямо в памяти.
    • Запоминай формулу, чтобы прикидывать: ширина * высота * байты_на_пиксель. Картинка 1000 на 1000 точек в формате RGBA? Держи свои честно отъёбанные 4 мегабайта оперативки! И это одна картинка, Карл!

Чё на практике, на примере:

// 1. Вжух! И 4 мегабайта оперативки попёрли (для буфера картинки)
let size = CGSize(width: 1000, height: 1000)
UIGraphicsBeginImageContextWithOptions(size, false, 0.0) // ~4 МБ RAM — пиши пропало

defer { UIGraphicsEndImageContext() } // Это ОБЯЗАТЕЛЬНО, иначе память будет висеть, как сопля!

// 2. Получаем контекст для рисования. И кто будет рисовать? Правильно, CPU, ебать его в сраку!
guard let context = UIGraphicsGetCurrentContext() else { return }

// Рисуем красный круг. Все вычисления координат, заливки — всё на процессоре.
context.setFillColor(UIColor.red.cgColor)
context.fillEllipse(in: CGRect(x: 250, y: 250, width: 500, height: 500))

// 3. И только теперь создаём UIImage из этого буфера в памяти.
let renderedImage = UIGraphicsGetImageFromCurrentImageContext()
// В `renderedImage` уже лежит сжатый битмап, который можно куда-то сохранить или показать.

И главный вывод, который бьёт, как хуем по башке: Core Graphics — это прожорливый на CPU монстр. Если тебе нужно что-то рисовать в реальном времени, часто и много (типа игры или сложной анимации), то это не твой инструмент. Тут надо брать Metal или SpriteKit, которые всю эту ебальную работу на видеокарту перекладывают, где ей самое место!