معماری گرافیک

آنچه هر توسعه‌دهنده‌ای باید درباره سطوح، SurfaceHolder،‏ EGLSurface،‏ SurfaceView،‏ GLSurfaceView،‏ SurfaceTexture،‏ TextureView،‏ SurfaceFlinger، و Vulkan بداند.

این صفحه عناصر ضروری معماری گرافیک سطح سیستم Android و نحوه استفاده چارچوب برنامه و سیستم چندرسانه‌ای از آن‌ها را شرح می‌دهد. تمرکز بر نحوه حرکت میانگیرهای داده‌های گرافیکی در سیستم است. اگر تاکنون از خود پرسیده‌اید که چرا SurfaceView و TextureView به این شکل عمل می‌کنند، یا سطوح و EGLSurface چگونه با هم تعامل دارند، جای درستی آمده‌اید.

آشنایی با دستگاه‌های Android و توسعه برنامه مفروض است. نیازی به دانش دقیق درباره چارچوب برنامه نیست و تماس‌های میانای برنامه‌سازی کاربردی بسیار کمی ذکر شده است، اما مطالب با دیگر اسناد عمومی هم‌پوشانی ندارد. هدف این است که جزئیات رویدادهای مهم دخیل در پرداز کردن یک قاب برای برونداد ارائه شود تا هنگام طراحی برنامه بتوانید انتخاب‌های آگاهانه‌ای داشته باشید. برای رسیدن به این هدف، این سند از پایین به بالا کار می‌کند و نحوه عملکرد کلاس‌های واسط کاربر را توضیح می‌دهد، نه نحوه استفاده از آن‌ها.

این بخش شامل چندین صفحه است که همه چیز را از مطالب پس‌زمینه گرفته تا جزئیات HAL و موارد استفاده پوشش می‌دهد. این مقاله با توضیح درباره بافرهای گرافیکی Android شروع می‌شود، سازوکار ترکیب و نمایش را شرح می‌دهد، سپس به سازوکارهای سطح بالاتری می‌پردازد که داده‌ها را به ترکیب‌کننده ارائه می‌دهند. توصیه می‌کنیم صفحه‌ها را به‌ترتیب زیر بخوانید و مستقیماً به موضوعی که به‌نظرتان جالب می‌رسد نروید.

عناصر سطح پایین

  • BufferQueue و gralloc. ‫BufferQueue چیزی را که بافرهای داده‌های گرافیکی تولید می‌کند (تولیدکننده) به چیزی که داده‌ها را برای نمایش یا پردازش بیشتر می‌پذیرد (مصرف‌کننده) متصل می‌کند. تخصیص‌های میان‌گیر ازطریق تخصیص‌دهنده حافظه gralloc که ازطریق میانای HAL مختص فروشنده پیاده‌سازی شده است انجام می‌شود.
  • SurfaceFlinger، Hardware Composer، و نمایشگرهای مجازی. ‫SurfaceFlinger بافرهای داده را از منابع مختلف می‌پذیرد، آن‌ها را ترکیب می‌کند، و به نمایشگر ارسال می‌کند. «لایه انتزاعی سخت‌افزار آهنگ‌ساز» (HWC) کارآمدترین روش را برای ترکیب کردن میان‌گیرها با سخت‌افزار دردسترس تعیین می‌کند و نمایشگرهای مجازی برونداد ترکیبی را در سیستم دردسترس قرار می‌دهند (ضبط کردن صفحه یا ارسال صفحه ازطریق شبکه).
  • Surface،‏ canvas، و SurfaceHolder. سطح یک صف میان‌گیر تولید می‌کند که اغلب توسط SurfaceFlinger مصرف می‌شود. هنگام رندر کردن روی سطح، نتیجه در میان‌گیری قرار می‌گیرد که به مصرف‌کننده ارسال می‌شود. «میاناهای برنامه‌سازی کاربردی Canvas» پیاده‌سازی نرم‌افزاری (با پشتیبانی از شتاب سخت‌افزاری) برای رسم مستقیم روی سطح (جایگزین سطح پایین برای OpenGL ES) ارائه می‌دهد. هر چیزی که به نما مربوط باشد شامل یک SurfaceHolder می‌شود که میاناهای برنامه‌سازی کاربردی آن امکان دریافت و تنظیم پارامترهای سطح را فراهم می‌کند، مثل اندازه و قالب.
  • EGLSurface و OpenGL ES. OpenGL ES (GLES) یک میانای برنامه‌سازی کاربردی برای رندر کردن گرافیک تعریف می‌کند که برای ترکیب شدن با EGL طراحی شده است، کتابخانه‌ای که می‌تواند ازطریق سیستم‌عامل پنجره ایجاد کند و به آن دسترسی داشته باشد (برای رسم چندضلعی‌های بافت‌دار، از فراخوانی‌های GLES استفاده کنید؛ برای قرار دادن رندر روی صفحه‌نمایش، از فراخوانی‌های EGL استفاده کنید). این صفحه همچنین ANativeWindow، معادل C/C++ کلاس Java Surface که برای ایجاد سطح پنجره EGL از کد بومی استفاده می‌شود را پوشش می‌دهد.
  • Vulkan. ‫Vulkan یک میانای برنامه‌سازی کاربردی چندسکویی با سربار کم برای گرافیک سه‌بعدی با عملکرد بالا است. Vulkan مانند OpenGL ES ابزارهایی برای ایجاد گرافیک‌های با کیفیت بالا و هم‌زمان در برنامه‌ها ارائه می‌دهد. مزایای Vulkan شامل کاهش سربار CPU و پشتیبانی از زبان SPIR-V Binary Intermediate است.

عناصر سطح بالا

  • SurfaceView و GLSurfaceView. ‫SurfaceView سطح و نمای را ترکیب می‌کند. عناصر نمای SurfaceView توسط SurfaceFlinger (و نه برنامه) ترکیب می‌شوند و پردازش از یک رشته/فرایند جداگانه و جداسازی از پردازش رابط کاربری برنامه را امکان‌پذیر می‌کنند. GLSurfaceView کلاس‌های کمکی برای مدیریت زمینه‌های EGL، ارتباط بین‌رشته‌ای، و تعامل با چرخه حیات فعالیت ارائه می‌دهد (اما برای استفاده از GLES الزامی نیست).
  • SurfaceTexture. ‫SurfaceTexture سطح و بافت GLES را ترکیب می‌کند تا BufferQueue برای برنامه‌تان به‌عنوان مصرف‌کننده ایجاد کند. وقتی تولیدکننده میان‌گیر جدیدی را در صف قرار می‌دهد، به برنامه شما اطلاع می‌دهد و برنامه به‌نوبه خود میان‌گیر قبلی را آزاد می‌کند، میان‌گیر جدید را از صف دریافت می‌کند، و فراخوانی‌های EGL را انجام می‌دهد تا میان‌گیر را به‌عنوان بافت خارجی برای GLES دردسترس قرار دهد. ‫Android 7.0 از بازپخش ویدیو با بافت امن پشتیبانی می‌کند و امکان پردازش پس‌از تولید محتوای ویدیویی محافظت‌شده با GPU را فراهم می‌کند.
  • TextureView. ‫TextureView نمای را با SurfaceTexture ترکیب می‌کند. TextureView یک SurfaceTexture را دربرمی‌گیرد و مسئولیت پاسخ دادن به بازخوانی‌ها و دریافت بافرهای جدید را برعهده دارد. هنگام ترسیم، TextureView از محتویات آخرین میان‌گیر دریافتی به‌عنوان منبع داده خود استفاده می‌کند و هرجا و هرطور که حالت نما نشان می‌دهد، آن را رندر می‌کند. ترکیب نما همیشه با GLES انجام می‌شود، یعنی به‌روزرسانی محتوا ممکن است باعث شود عناصر نمای دیگر نیز دوباره طراحی شوند.