Surface و SurfaceHolder

اشیاء Surface به برنامه‌ها امکان می‌دهند تصاویر را برای نمایش در صفحه‌نمایش‌ها پرداز کنند. میاناهای SurfaceHolder به برنامه‌ها امکان می‌دهد سطوح را ویرایش و کنترل کنند.

سطح

سطح واسطی برای تولیدکننده است تا میانگیرها را با مصرف‌کننده مبادله کند.

سطوح نمایش معمولاً از «صف‌های بافر» پیکربندی‌شده برای بافر سه‌گانه استفاده می‌کنند. میان‌گیرها براساس تقاضا اختصاص داده می‌شوند، بنابراین اگر تولیدکننده میان‌گیرها را به‌اندازه کافی آهسته تولید کند، مثلاً با سرعت ۳۰ فریم در ثانیه در نمایشگر ۶۰ فریم در ثانیه، ممکن است فقط دو میان‌گیر اختصاص‌داده‌شده در صف وجود داشته باشد. اختصاص دادن بافرها براساس تقاضا به به‌حداقل رساندن مصرف حافظه کمک می‌کند. می‌توانید خلاصه‌ای از میان‌گیرهای مرتبط با هر لایه را در برونداد dumpsys SurfaceFlinger ببینید.

اکثر مشتریان بااستفاده از OpenGL ES یا Vulkan روی سطوح پردازش می‌کنند. بااین‌حال، برخی‌از کارخواه‌ها بااستفاده از بوم روی سطوح پرداز می‌کنند.

پرداز بوم نقاشی

کتابخانه گرافیک Skia پیاده‌سازی بوم را ارائه می‌دهد. اگر می‌خواهید مستطیلی بکشید، Canvas API را فرامی‌خوانید که بایت‌ها را به‌طور مناسب در میان‌گیر تنظیم می‌کند. برای اطمینان از اینکه بافر توسط دو مشتری به‌طور هم‌زمان به‌روزرسانی نمی‌شود یا درحالی‌که نمایش داده می‌شود روی آن نوشته نمی‌شود، بافر را برای دسترسی به آن قفل کنید. برای کار با قفل‌های بوم، از فرمان‌های زیر استفاده کنید:

  • lockCanvas() میان‌گیر را برای پردازاندن در CPU قفل می‌کند و Canvas را برای استفاده در طراحی برمی‌گرداند.
  • unlockCanvasAndPost() قفل میان‌گیر را باز می‌کند و آن را به ترکیب‌کننده ارسال می‌کند.
  • lockHardwareCanvas() میان‌گیر را برای پردازاندن در GPU قفل می‌کند و بومی را برای استفاده در طراحی برمی‌گرداند.

اولین‌بار که تولیدکننده از BufferQueue درخواست میان‌گیر می‌کند، میان‌گیر تخصیص داده می‌شود و با صفر مقداردهی اولیه می‌شود. راه‌اندازی اولیه برای جلوگیری از هم‌رسانی ناخواسته داده‌ها بین فرایندها ضروری است. بااین‌حال، اگر از یک بافر استفاده مجدد کنید، محتوای قبلی همچنان وجود دارد. اگر به‌طور مکرر با lockCanvas() و unlockCanvasAndPost() تماس بگیرید بدون اینکه چیزی بکشید، تولیدکننده بین قاب‌های قبلاً رندرشده می‌چرخد.

کد قفل/باز کردن سطح به بافر قبلاً رندرشده ارجاع می‌دهد. اگر هنگام قفل کردن سطح، ناحیه کثیفی را مشخص کنید، پیکسل‌های غیرکثیف را از میان‌گیر قبلی کپی می‌کند. ‫SurfaceFlinger یا HWC معمولاً بافر را مدیریت می‌کنند؛ اما چون فقط باید از بافر بخوانید، نیازی نیست منتظر دسترسی انحصاری بمانید.

SurfaceHolder

SurfaceHolder میانایی است که سیستم برای هم‌رسانی مالکیت سطوح با برنامه‌ها استفاده می‌کند. برخی‌از کارخواهانی که با سطوح کار می‌کنند SurfaceHolder می‌خواهند، زیرا میاناهای برنامه‌سازی کاربردی برای دریافت و تنظیم پارامترهای سطح ازطریق SurfaceHolder پیاده‌سازی می‌شوند. SurfaceView حاوی یک SurfaceHolder است.

بیشتر مؤلفه‌هایی که با نما تعامل دارند شامل SurfaceHolder می‌شوند. برخی‌از میاناهای برنامه‌سازی کاربردی دیگر، مثل MediaCodec، روی خود سطح عمل می‌کنند.