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

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

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

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

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

اجزای سطح پایین

  • BufferQueue و gralloc . BufferQueue چیزی را که بافرهایی از داده های گرافیکی تولید می کند ( تولید کننده ) به چیزی که داده ها را برای نمایش یا پردازش بیشتر می پذیرد ( مصرف کننده ) متصل می کند. تخصیص بافر از طریق تخصیص دهنده حافظه gralloc که از طریق یک رابط HAL مخصوص فروشنده اجرا می شود، انجام می شود.
  • SurfaceFlinger، Hardware Composer و نمایشگرهای مجازی . SurfaceFlinger بافرهای داده را از چندین منبع می پذیرد، آنها را ترکیب می کند و به صفحه نمایش می فرستد. Hardware Composer HAL (HWC) کارآمدترین راه را برای بافرهای ترکیبی با سخت افزار موجود تعیین می کند و نمایشگرهای مجازی خروجی ترکیبی را در سیستم در دسترس قرار می دهند (ضبط صفحه یا ارسال صفحه نمایش از طریق شبکه).
  • Surface، Canvas و SurfaceHolder . یک سطح یک صف بافر تولید می کند که اغلب توسط SurfaceFlinger مصرف می شود. هنگام رندر روی سطح، نتیجه به یک بافر می رسد که برای مصرف کننده ارسال می شود. Canvas API یک پیاده‌سازی نرم‌افزاری (با پشتیبانی از شتاب سخت‌افزاری) برای طراحی مستقیم روی یک سطح (جایگزین سطح پایین OpenGL ES) ارائه می‌کند. هر چیزی که به یک view مربوط می شود شامل یک SurfaceHolder است که API های آن دریافت و تنظیم پارامترهای سطح مانند اندازه و قالب را امکان پذیر می کند.
  • EGLSurface و OpenGL ES . OpenGL ES (GLES) یک API رندر گرافیکی را تعریف می کند که برای ترکیب با EGL طراحی شده است، کتابخانه ای که می تواند پنجره ها را از طریق سیستم عامل ایجاد کند و به آنها دسترسی داشته باشد (برای ترسیم چند ضلعی های بافت، از تماس های GLES استفاده کنید؛ برای قرار دادن رندر روی صفحه، از تماس های EGL استفاده کنید. ). این صفحه همچنین ANativeWindow را پوشش می‌دهد، معادل C/C++ کلاس Java Surface که برای ایجاد سطح پنجره EGL از کد اصلی استفاده می‌شود.
  • ولکان . Vulkan یک API کم سربار و چند پلتفرمی برای گرافیک سه بعدی با کارایی بالا است. مانند OpenGL ES، Vulkan ابزارهایی را برای ایجاد گرافیک با کیفیت بالا و در زمان واقعی در برنامه ها ارائه می دهد. مزایای 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 از محتویات آخرین بافر دریافتی به عنوان منبع داده خود استفاده می کند و هر کجا و هر طور که وضعیت view نشان می دهد که باید ارائه شود. نمایش ترکیب‌بندی همیشه با GLES انجام می‌شود، به این معنی که به‌روزرسانی‌های محتویات ممکن است باعث شود سایر عناصر نمای نیز دوباره ترسیم شوند.