گرافیک ها

نماد Android Graphics HAL

چارچوب Android میاناهای برنامه‌سازی کاربردی متنوعی برای پردازش گرافیک دوبعدی و سه‌بعدی ارائه می‌دهد که با پیاده‌سازی‌های سازنده درایورهای گرافیک تعامل دارند، بنابراین مهم است که درک خوبی از نحوه عملکرد این میاناهای برنامه‌سازی کاربردی در سطح بالاتر داشته باشید. این صفحه لایه انتزاعی سخت‌افزار (HAL) گرافیک را که این درایورها براساس آن ساخته شده‌اند معرفی می‌کند. پیش‌از ادامه دادن این بخش، با شرایط زیر آشنا شوید:

بوم نقاشی (اصطلاح کلی)، Canvas (عنصر میانای برنامه‌سازی کاربردی)
بوم سطحی برای طراحی است که ترکیب‌بندی بیت‌های واقعی را دربرابر نقشه بیتی یا شیء Surface مدیریت می‌کند. کلاس Canvas روش‌هایی برای رسم استاندارد رایانه‌ای از بیت‌مپ‌ها، خطوط، دایره‌ها، مستطیل‌ها، نوشتار، و غیره دارد و به یک بیت‌مپ یا سطح محدود می‌شود. بوم ساده‌ترین و آسان‌ترین راه برای طراحی اشیاء دوبعدی روی صفحه است. کلاس پایه Canvas است.
ترسیمی
drawable یک منبع بصری کامپایل‌شده است که می‌تواند به‌عنوان پس‌زمینه، عنوان، یا بخش دیگری از صفحه استفاده شود. معمولاً دارارسم در عنصر دیگر واسط کاربر بار می‌شود، برای مثال به‌عنوان تصویر پس‌زمینه. یک drawable نمی‌تواند رویدادها را دریافت کند، اما ویژگی‌های مختلف دیگری مانند وضعیت و زمان‌بندی را اختصاص می‌دهد تا زیرکلاس‌هایی مانند اشیاء پویانمایی یا کتابخانه‌های تصویر را فعال کند. بسیاری از اشیای طراحی‌شدنی از فایل‌های منبع طراحی‌شدنی بار می‌شوند — فایل‌های XML یا بیت‌مپ که تصویر را توصیف می‌کنند. منابع قابل‌رسم در زیرکلاس‌های android.graphics.drawable کامپایل می‌شوند. برای اطلاعات بیشتر درباره منابع قابل‌ترسیم و منابع دیگر، به نمای کلی منابع برنامه مراجعه کنید.
منبع چیدمان
منبع چیدمان فایل XML است که چیدمان صفحه فعالیت را توصیف می‌کند. برای اطلاعات بیشتر، منبع چیدمان را ببینید.
نه تکه (9-patch،‏ NinePatch)
نه تکه یک منبع بیت‌مپ تغییرپذیر است که می‌تواند برای پس‌زمینه‌ها یا دیگر تصاویر در دستگاه استفاده شود. برای اطلاعات بیشتر، به نه تکه مراجعه کنید.
OpenGL ES
‫OpenGL ES یک میانای برنامه‌سازی کاربردی چندپلاتفرمی برای پردازش گرافیک دوبعدی و سه‌بعدی است. ‫Android کتابخانه‌های OpenGL ES را برای پردازش سه‌بعدی با شتاب سخت‌افزاری ارائه می‌دهد. برای پرداز دوبعدی، بوم گزینه ساده‌تری است. OpenGL ES در کیت توسعه بومی Android (NDK) دردسترس است. بسته‌های android.opengl و javax.microedition.khronos.opengles عملکرد OpenGL ES را آشکار می‌کنند.
سطح (اصطلاح کلی)، Surface (عنصر میانای برنامه‌سازی کاربردی)
سطح نشان‌دهنده بلوکی از حافظه است که در صفحه‌نمایش ترکیب می‌شود. سطح بوم نقاشی را نگه می‌دارد و روش‌های کمکی مختلفی برای رسم لایه‌ها و تغییر اندازه شیء Surface ارائه می‌دهد. به‌جای SurfaceView مستقیماً از کلاس Surface استفاده کنید.
نمای سطحی (اصطلاح عمومی)، SurfaceView (عنصر API)
نمای سطح یک شیء View است که یک شیء Surface را برای طراحی می‌پوشاند و روش‌هایی را برای مشخص کردن اندازه و قالب آن به‌صورت پویا ارائه می‌دهد. نمای سطح روشی برای رسم مستقل از رشته رابط کاربری برای عملیات پرمنبع مانند بازی‌ها یا پیش‌نمایش‌های دوربین ارائه می‌دهد، اما درنتیجه از حافظه اضافی استفاده می‌کند. نمای سطحی از هر دو گرافیک بوم و OpenGL ES پشتیبانی می‌کند. کلاس پایه برای شیء SurfaceView SurfaceView است.
طرح‌ زمینه
زمینه مجموعه‌ای از ویژگی‌ها، مانند اندازه نوشتار و رنگ پس‌زمینه، است که با هم دسته‌بندی شده‌اند تا تنظیمات پیش‌فرض نمایش مختلف را تعریف کنند. ‫Android چند زمینه استاندارد ارائه می‌دهد که در R.style فهرست شده‌اند و با Theme_ پیش‌گفتار دارند.
نمایش (اصطلاح عمومی)، View (عنصر میانای برنامه‌سازی کاربردی)
نما ناحیه‌ای مستطیلی روی صفحه ترسیم می‌کند و رویدادهای کلیک، فشردن کلید، و تعامل‌های دیگر را مدیریت می‌کند. کلاس View کلاس پایه برای اکثر عناصر چیدمان صفحه فعالیت یا کادر گفتگو، مثل چارگوش‌های نوشتاری و پنجره‌ها است. شیء View تماس‌هایی از شیء والد خود دریافت می‌کند (به ViewGroup مراجعه کنید) تا خود را رسم کند و شیء والد خود را از اندازه و مکان ترجیحی خود مطلع می‌کند، که ممکن است توسط والد رعایت نشود. برای اطلاعات بیشتر، به View مراجعه کنید.
مشاهده گروه (اصطلاح عمومی)، ViewGroup (عنصر API)
گروه نما مجموعه‌ای از نماهای فرزند را گروه‌بندی می‌کند. گروه نما مسئول تصمیم‌گیری درباره محل قرارگیری نماهای فرزند و اندازه آن‌ها است و همچنین درصورت لزوم، هرکدام را برای ترسیم خود فراخوانی می‌کند. برخی‌از گروه‌های نما نامرئی هستند و فقط برای چیدمان استفاده می‌شوند، درحالی‌که برخی‌از آن‌ها میانای کاربر ذاتی دارند، مثل چارگوش فهرست پیمایشی. گروه‌های نمایشی در بسته android.widget قرار دارند، اما کلاس ViewGroup را گسترش می‌دهند.
سلسله‌مراتب نما
سلسله‌مراتب نما آرایشی از اشیای نما و گروه نما است که میانای کاربر را برای هر مؤلفه برنامه تعریف می‌کند. سلسله‌مراتب شامل گروه‌های نما است که شامل یک یا چند نمای فرزند یا گروه نما است. بااستفاده از Hierarchy Viewer که همراه با کیت توسعه نرم‌افزار Android ارائه می‌شود، می‌توانید نمایشی تصویری از سلسله‌مراتب نما برای اشکال‌زدایی و بهینه‌سازی دریافت کنید.
Vulkan
Vulkan یک میانای برنامه‌سازی کاربردی چندسکویی با سربار کم برای گرافیک سه‌بعدی با عملکرد بالا است.
ابزاره
ابزارک یکی از مجموعه‌ای از زیرکلاس‌های نمای کاملاً پیاده‌سازی‌شده است که عناصر فرم و دیگر عناصر میانای کاربر، مثل چارگوش نوشتار یا منو جهنده، را پرداز می‌کنند. چون ابزاره به‌طور کامل پیاده‌سازی شده است، اندازه‌گیری، ترسیم خودش، و پاسخ دادن به رویدادهای صفحه‌نمایش را مدیریت می‌کند. ابزاره‌ها در بسته android.widget قرار دارند.
window (generic term), Window (API element)
در برنامه Android، پنجره شیئی است که از Window کلاس انتزاعی مشتق شده است و عناصر پنجره عمومی را مشخص می‌کند، مثل ظاهر و احساس، نوشتار نوار عنوان، و مکان و محتوای منوها. کادرهای گفتگو و فعالیت‌ها از پیاده‌سازی کلاس Window برای ارائه شیء Window استفاده می‌کنند. نیازی نیست کلاس Window را پیاده‌سازی کنید یا از پنجره‌ها در برنامه‌تان استفاده کنید.

توسعه‌دهندگان برنامه تصاویر را به سه روش در صفحه‌نمایش رسم می‌کنند: با بوم، OpenGL ES، یا Vulkan.

عناصر گرافیکی Android

توسعه‌دهندگان از هر API پردازشی که استفاده کنند، همه چیز روی یک سطح پردازش می‌شود. سطح نشان‌دهنده طرف تولیدکننده یک صف بافر است که اغلب توسط SurfaceFlinger مصرف می‌شود. هر پنجره‌ای که در پلاتفرم Android ایجاد می‌شود، توسط یک سطح پشتیبانی می‌شود. همه سطوح رؤیت‌پذیر پردازش‌شده توسط SurfaceFlinger روی نمایشگر ترکیب می‌شوند.

نمودار زیر نحوه عملکرد مشترک عناصر کلیدی را نشان می‌دهد:

عناصر پرداز زدن تصویر

شکل ۱. نحوه پرداز سطوح.

اجزای اصلی در بخش‌های زیر شرح داده شده است.

تولیدکنندگان جاری‌سازی تصویر

تولیدکننده جاری‌سازی تصویر می‌تواند هر چیزی باشد که بافرهای گرافیکی برای مصرف تولید می‌کند. برای مثال، می‌توان به OpenGL ES،‏ Canvas 2D، و کدبندهای ویدیو mediaserver اشاره کرد.

مصرف‌کنندگان جاری‌سازی تصویر

رایج‌ترین مصرف‌کننده جریان‌های تصویر SurfaceFlinger است، سرویس سیستمی که سطوح قابل‌مشاهده فعلی را مصرف می‌کند و آن‌ها را بااستفاده از اطلاعات ارائه‌شده توسط «مدیر پنجره» روی نمایشگر ترکیب می‌کند. ‫SurfaceFlinger تنها سرویسی است که می‌تواند محتوای نمایشگر را تغییر دهد. ‫SurfaceFlinger از OpenGL و «ترکیب‌کننده سخت‌افزاری» (HWC) برای ترکیب گروهی از سطوح استفاده می‌کند.

برنامه‌های دیگر OpenGL ES نیز می‌توانند از جاری‌سازی‌های تصویر استفاده کنند، برای مثال، برنامه دوربین از جاری‌سازی تصویر پیش‌نمایش دوربین استفاده می‌کند. برنامه‌های غیرGL نیز می‌توانند مصرف‌کننده باشند، برای مثال کلاس ImageReader.

آهنگ‌ساز سخت‌افزاری

انتزاع سخت‌افزاری برای زیرسیستم نمایش. ‫SurfaceFlinger می‌تواند برخی‌از کارهای ترکیب را به HWC واگذار کند تا کار از OpenGL و GPU بارگیری شود. ‫SurfaceFlinger به‌عنوان یک کارخواه OpenGL ES دیگر عمل می‌کند. بنابراین، وقتی SurfaceFlinger به‌طور فعال یک یا دو بافر را در بافر سوم ترکیب می‌کند، برای مثال، از OpenGL ES استفاده می‌کند. این کار باعث می‌شود ترکیب‌بندی نسبت‌به زمانی که GPU همه محاسبات را انجام می‌دهد، توان کمتری مصرف کند.

Hardware Composer HAL نیمه دیگر کار را انجام می‌دهد و نقطه مرکزی برای همه پردازهای گرافیکی Android است. «کنترل‌کننده سخت‌افزاری» باید از رویدادها پشتیبانی کند، یکی از آن‌ها VSync است (دیگری اتصال سریع برای پشتیبانی از HDMI آماده استفاده است).

Gralloc

تخصیص‌دهنده حافظه گرافیکی (Gralloc) برای تخصیص حافظه درخواست‌شده توسط تولیدکنندگان تصویر موردنیاز است. برای جزئیات، BufferQueue و Gralloc را ببینید.

جریان داده‌ها

نمودار زیر خط لوله گرافیک Android را نشان می‌دهد:

جریان داده‌های گرافیک

شکل ۲. جریان داده‌های گرافیکی ازطریق Android.

اشیاء سمت راست پردازنده گرافیکی هستند که میانگیرهای گرافیکی تولید می‌کنند، مثل صفحه اصلی، نوار وضعیت، و میانای کاربر سامانه. ‫SurfaceFlinger آهنگ‌ساز و HWC آهنگ‌ساز است.

BufferQueue

BufferQueues پیونددهنده بین مؤلفه‌های گرافیکی Android است. این‌ها جفت صف‌هایی هستند که چرخه ثابت بافرها را از تولیدکننده به مصرف‌کننده میانجی‌گری می‌کنند. پس‌از اینکه تولیدکنندگان میان‌گیرهایشان را تحویل دادند، SurfaceFlinger مسئول ترکیب کردن همه چیز در نمایشگر است.

نمودار زیر فرایند ارتباطی BufferQueue را نشان می‌دهد:

فرایند ارتباطی BufferQueue

شکل ۳. فرایند ارتباط BufferQueue.

‫BufferQueue حاوی منطقی است که تولیدکنندگان جاری‌سازی تصویر و مصرف‌کنندگان جاری‌سازی تصویر را به هم پیوند می‌دهد. پیش‌نمایش‌های دوربین تولیدشده توسط HAL دوربین یا بازی‌های OpenGL ES ازجمله نمونه‌های تولیدکننده تصویر هستند. برخی‌از نمونه‌های مصرف‌کنندگان تصویر عبارت‌اند از SurfaceFlinger یا برنامه دیگری که جاری‌سازی OpenGL ES را نمایش می‌دهد، مثل برنامه دوربین که نمایاب دوربین را نمایش می‌دهد.

‫BufferQueue ساختار داده‌ای است که استخر میان‌گیر را با صف ترکیب می‌کند و از ارتباط بین‌فرایندی (IPC) ‏Binder برای انتقال میان‌گیرها بین فرایندها استفاده می‌کند. میانای تولیدکننده، یا آنچه به فردی که می‌خواهد میانگیرهای گرافیکی تولید کند منتقل می‌کنید، IGraphicBufferProducer (بخشی از SurfaceTexture) است. BufferQueue اغلب برای رندر کردن در Surface و مصرف با GL Consumer، در میان سایر وظایف، استفاده می‌شود.

BufferQueue می‌تواند در سه حالت مختلف عمل کند:

حالت هم‌زمان‌مانند
‫BufferQueue به‌طور پیش‌فرض در حالت هم‌زمان‌مانند عمل می‌کند، که در آن هر بافری که از تولیدکننده می‌آید به مصرف‌کننده می‌رود. در این حالت، هیچ میان‌گیری دور انداخته نمی‌شود. و اگر تولیدکننده خیلی سریع باشد و بافرها را سریع‌تر از تخلیه آن‌ها ایجاد کند، مسدود می‌شود و منتظر بافرهای آزاد می‌ماند.
حالت غیرمسدودکننده
‫BufferQueue می‌تواند در حالت غیرمسدودکننده نیز عمل کند که در این حالت به‌جای انتظار برای بافر در این موارد، خطا تولید می‌کند. در این حالت نیز هیچ‌گاه بافر دور انداخته نمی‌شود. این کار برای جلوگیری از بن‌بست‌های احتمالی در نرم‌افزار کاربردی که ممکن است وابستگی‌های پیچیده چارچوب گرافیک را درک نکند مفید است.
حالت دور انداختن
‫BufferQueue ممکن است به‌گونه‌ای پیکربندی شود که به‌جای تولید خطا یا انتظار، بافرهای قدیمی را دور بریزد. برای مثال، اگر درحال انجام GL پردازش به نمای بافت و رسم کردن در سریع‌ترین زمان ممکن هستید، باید بافرها حذف شوند.

برای انجام بیشتر این کار، SurfaceFlinger فقط به‌عنوان یک کارخواه OpenGL ES دیگر عمل می‌کند. بنابراین وقتی SurfaceFlinger به‌طور فعال یک یا دو میان‌گیر را در میان‌گیر سومی ترکیب می‌کند، برای مثال، از OpenGL ES استفاده می‌کند.

«لایه انتزاعی سخت‌افزار آهنگساز سخت‌افزاری» نیمه دیگر کار را انجام می‌دهد. این HAL به‌عنوان نقطه مرکزی برای همه پرداز زدن‌های گرافیکی Android عمل می‌کند.