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

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

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

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

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

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

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

اجزای سطح بالا

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