Ответ
Core Graphics — это низкоуровневый C-API для векторного и растрового рисования. В отличие от Core Animation, он в основном загружает CPU, а GPU используется выборочно.
Распределение ресурсов:
-
CPU (Основная нагрузка):
- Выполнение всех команд рисования (линии, кривые, заливки).
- Растеризация векторных путей (path) в пиксели.
- Управление цветовыми пространствами и трансформациями.
-
GPU (Вспомогательная роль):
- Некоторые операции могут быть ускорены (например, простые заливки, масштабирование bitmap), но это зависит от устройства и контекста.
- Финализация и передача готового bitmap в системный композитор для отображения.
-
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.