نکات کلیدی
رندرینگ فرآیند تبدیل دادهها (رئوس، بافتها، شیدرها) به تصویر روی صفحه است. در دستگاههای موبایل، رندرینگ میتواند روی CPU (پردازنده مرکزی) یا GPU (پردازنده گرافیکی) انجام شود. انتخاب بستگی به نوع گرافیک و عملکرد مورد نیاز دارد.
CPU Rendering — پردازش ترتیبی. هر دستور یکی پس از دیگری اجرا میشود. CPU برای منطق و انشعاب بهینه شده است. Canvas (Android), Core Graphics (iOS) روی CPU کار میکنند. مزیت: دقت، پشتیبانی از الگوریتمهای پیچیده. عیب: کندی با تعداد زیادی عناصر گرافیکی. GPU Rendering — پردازش موازی. هزاران هسته GPU به طور همزمان رئوس و پیکسلها را پردازش میکنند. Metal (iOS), Vulkan (Android), OpenGL ES (هر دو پلتفرم) از GPU استفاده میکنند. GPU Rendering برای سهبعدی، انیمیشنهای 60 FPS و افکتهای پیچیده اجباری است. فریمورکهای مدرن UI (SwiftUI, Jetpack Compose, Flutter) به طور پیشفرض از GPU استفاده میکنند.
شیدرها برنامههایی هستند که روی GPU اجرا میشوند. آنها تعیین میکنند هر شیء روی صفحه چگونه به نظر برسد. خط لوله گرافیک از چند مرحله تشکیل شده است، اما دو شیدر اصلی — Vertex Shader و Fragment Shader — در 99٪ موارد استفاده میشوند. شیدرها به زبان GLSL (OpenGL)، MSL (Metal) یا HLSL (DirectX) نوشته میشوند.
Vertex Shader — رئوس یک مدل سهبعدی را پردازش میکند. ورودی: موقعیت رأس، نرمال، مختصات 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 |
| کاربرد | گرافیک ساده دو بعدی، متن، UI | سهبعدی، انیمیشن، بازی، افکتهای پیچیده |
| مصرف | انرژی کمتر | انرژی بیشتر، اما سریعتر |
| Overdraw | هزینه بالا | هزینه کمتر (اما همچنان مضر) |
CPU — برای منطق و Canvas. GPU — برای گرافیک و انیمیشنها. IT Sectr توصیه میکند برای هر محتوای متحرک (انیمیشن، انتقال، اسکرول) از GPU rendering استفاده کنید — این کار 60 FPS پایدار را تضمین میکند.
Core Animation — فریمورک اپل برای رندرینگ انیمیشنی شتابیافته با GPU. عنصر پایه CALayer است: یک ناحیه مستطیلی با محتوا (تصویر، رنگ، متن). CALayer مدیریت میکند: موقعیت، اندازه، رنگ پسزمینه، حاشیه، سایه، cornerRadius و تبدیلها (دو و سهبعدی). Core Animation به طور خودکار لایهها را روی GPU ترکیب میکند — توسعهدهنده نیازی به نوشتن کد گرافیکی ندارد.
CALayer — یک شیء سبک (نه view) که بیتمپ محتوا را نگه میدارد. 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 — موقعیتی که در آن یک پیکسل در یک فریم چندین بار رنگ میشود. مثال: پسزمینه قرمز → مستطیل آبی → متن. پیکسل مرکزی ۳ بار رسم میشود. Overdraw علت اصلی کندی UI است، به ویژه در دستگاههای قدیمی. iOS: Debug Color Blended Layers (Xcode) — نواحی قرمز = ترکیب شده (overdraw). Android: Debug GPU Overdraw (گزینههای توسعهدهنده) — رنگها از آبی (1x) تا قرمز (3x+).
چگونه Overdraw را کاهش دهیم: 1) برای views غیرشفاف از 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 vector assets (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 — رسم ترتیبی روی پردازنده مرکزی. مناسب برای گرافیک دو بعدی ساده و 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 vector assets. در Android — Vector Drawable XML. IT Sectr برای iOS PDF و برای Android Vector Drawable XML را توصیه میکند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.