Основни точки
Рендиране е процесът на превръщане на данни (върхове, текстури, шейдъри) в изображение на екрана. В мобилните устройства рендирането може да се извършва на CPU (централен процесор) или GPU (графичен процесор). Изборът зависи от вида на графиката и необходимата производителност.
CPU Rendering — последователна обработка. Всяка инструкция се изпълнява една след друга. CPU е оптимизиран за логика и разклонения. Canvas (Android), Core Graphics (iOS) работят на CPU. Предимство: точност, поддръжка на сложни алгоритми. Недостатък: бавно при голям брой графични елементи. GPU Rendering — паралелна обработка. Хиляди ядра на GPU обработват едновременно върхове и пиксели. Metal (iOS), Vulkan (Android), OpenGL ES (и двете платформи) използват GPU. GPU Rendering е задължителен за 3D, анимации с 60 FPS и сложни ефекти. Съвременните UI рамки (SwiftUI, Jetpack Compose, Flutter) използват GPU по подразбиране.
Шейдъри са програми, изпълнявани на GPU. Те определят как всеки обект изглежда на екрана. Графичният конвейер се състои от няколко етапа, но два основни шейдъра — Vertex Shader и Fragment Shader — се използват в 99% от случаите. Шейдърите се пишат на GLSL (OpenGL), MSL (Metal) или HLSL (DirectX).
Vertex Shader — обработва върховете на 3D модел. Вход: позиция на върха, нормала, UV координати. Изход: трансформирана позиция (модел → изглед → проекция). Vertex Shader не може да създава или изтрива върхове — само да ги трансформира. Fragment Shader — изчислява цвета на всеки пиксел (фрагмент) в растеризиран триъгълник. Вход: интерполирани данни от Vertex Shader (UV, нормали). Изход: RGBA цвят. Fragment Shader отговаря за текстуриране, осветление (Phong, PBR) и пост-ефекти. Съвременните двигатели (Unity, Unreal) генерират шейдъри автоматично, но разбирането на конвейера е необходимо за оптимизация.
Offscreen Rendering — рендиране не на екрана, а във временен буфер. Използва се за: 1) ефекти (blur, shadow), 2) рендиране в текстура, 3) предварително изчисляване на кадри. Offscreen Rendering е скъп: превключване на контекст и допълнително преминаване на рендиране. iOS автоматично включва Offscreen Rendering за сенки и cornerRadius. Растеризация — превръщане на векторни данни (върхове + шейдъри) в пиксели. Растеризаторът определя кои фрагменти принадлежат на триъгълник и извиква Fragment Shader. Композитинг — сглобяване на слоеве в крайното изображение. Core Animation композитира CALayer, Android композитира слоеве SurfaceFlinger.
| Параметър | CPU Rendering | GPU Rendering |
|---|---|---|
| Архитектура | Последователна (няколко ядра) | Паралелна (стотици-хиляди ядра) |
| Скорост | Бавна за графика | Бърза за масови операции |
| Инструменти | Canvas, Core Graphics (Quartz 2D) | Metal, OpenGL ES, Vulkan |
| Приложение | Проста 2D графика, текст, UI | 3D, анимации, игри, сложни ефекти |
| Консумация | По-малко енергия | Повече енергия, но по-бързо |
| Overdraw | Висока цена | По-ниска цена (но все още вреден) |
CPU — за логика и Canvas. GPU — за графика и анимации. IT Sectr препоръчва използването на GPU рендиране за всяко движещо се съдържание (анимации, преходи, скрол) — това осигурява стабилни 60 FPS.
Core Animation — рамката на Apple за GPU-ускорено анимирано рендиране. Основният елемент е CALayer: правоъгълна област със съдържание (изображение, цвят, текст). CALayer управлява: позиция, размер, цвят на фона, граница, сянка, cornerRadius и трансформации (2D и 3D). Core Animation автоматично композитира слоеве на GPU — разработчикът не трябва да пише графичен код.
CALayer — лек обект (не изглед), който съдържа битмап на съдържанието. UIButton, UILabel, UIImageView — всички вътрешно използват CALayer. Свойства: frame, bounds, position, anchorPoint, transform, opacity, masksToBounds. Анимацията на свойствата на CALayer се извършва на GPU — това е основното предимство на Core Animation. CALayer.shouldRasterize — включва растеризация на слоя за кеширане на сложна графика. CAShapeLayer — подклас за векторна графика: чертае път на GPU. Използва се за ленти за напредък, графики, маски и анимация на форми. CAShapeLayer.path — анимируемо свойство (анимация на морфинг на форми).
Композитинг в Core Animation — процесът на сглобяване на CALayer в крайния кадър. Всеки CALayer е отделна текстура на GPU. Композитингът се извършва в Render Server (отделен процес). Свойства, изискващи композитинг: opacity, shadow, cornerRadius + masksToBounds, shouldRasterize. Колкото по-малко слоеве — толкова по-бърз композитинг.
Overdraw — ситуация, при която един и същ пиксел се боядисва няколко пъти в един кадър. Пример: червен фон → син правоъгълник → текст. Централният пиксел се изчертава 3 пъти. Overdraw е основната причина за забавяне на UI, особено на по-стари устройства. iOS: Debug Color Blended Layers (Xcode) — червени зони = смесени (overdraw). Android: Debug GPU Overdraw (Опции за разработчици) — цветове от синьо (1x) до червено (3x+).
Как да намалим Overdraw: 1) използвайте opaque = true за непрозрачни изгледи (iOS). 2) Android — използвайте android:windowBackground само веднъж. 3) Премахнете невидимите слоеве. 4) Използвайте слоиста архитектура: фон (1 преминаване) → съдържание (2 преминавания). 5) Избягвайте ненужни clipChildren и clipToPadding. Offscreen Rendering — рендиране в буфер преди екрана. Тригери: shadow (CALayer.shadow*), cornerRadius + masksToBounds, group opacity, shouldRasterize. Xcode: Debug Offscreen Renderer — жълти зони = offscreen. На Android: profile GPU rendering — проверете дължината на лентите.
Векторна графика — изображения, описани с математически формули (пътища, криви, запълвания). Векторите не губят качество при мащабиране — идеално за икони и илюстрации в мобилни приложения.
SVG (Scalable Vector Graphics) — стандарт W3C. Не се поддържа директно в мобилни ОС. Конвертира се: на iOS — в PDF векторни активи (Xcode 12+), на Android — във Vector Drawable XML. Vector Drawable — Android формат. Дефинира се в XML: <vector> с <path> и <group>. Поддържа анимация чрез AnimatedVectorDrawable. PDF Vector Assets (iOS) — векторни PDF в Assets.xcassets. Xcode ги компилира в GPU-оптимизирани текстури. SVG и Vector Drawable не поддържат сложни ефекти (blur, gradient mesh). За снимки и градиенти използвайте растерни PNG/WebP.
Често задавани въпроси
CPU рендиране — последователно изчертаване на централния процесор. Подходящо за проста 2D графика и Canvas. GPU рендирането използва паралелната архитектура на графичния процесор за масово обработване на върхове и пиксели.
Overdraw — изчертаване на пиксел няколко пъти на кадър. Инструменти: Debug GPU Overdraw (Android), Color Blended Layers (iOS). Нормално: синьо (1x) и зелено (2x). Червено (3x+) — проблем.
CALayer — базовият клас на Core Animation. CAShapeLayer — подклас за векторна графика на GPU. И двата се управляват от Core Animation и се композитират в Render Server.
Vertex Shader — GPU програма за обработка на върхове. Fragment Shader — GPU програма за изчисляване на цветове на пиксели. Заедно те реализират графичния конвейер.
SVG — стандарт W3C, не се поддържа директно. На iOS — PDF векторни активи. На Android — Vector Drawable XML. IT Sectr препоръчва PDF за iOS и Vector Drawable XML за Android.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.