Surface و SurfaceHolder

اشیاface سطحی برنامه ها را قادر می سازد تصاویر را برای نمایش در صفحه نمایش دهند. رابط های SurfaceHolder برنامه ها را قادر می سازد تا سطوح را ویرایش و کنترل کنند.

سطح

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

BufferQueue برای یک صفحه نمایش معمولاً برای بافر سه گانه پیکربندی می شود. بافرها بر اساس تقاضا تخصیص می یابند ، بنابراین اگر تولید کننده بافرهایی را به آرامی تولید کند ، مانند سرعت 30 فریم در ثانیه در نمایشگر 60 فریم در ثانیه ، ممکن است فقط دو بافر اختصاص یافته در صف وجود داشته باشد. اختصاص بافرهای مورد نیاز به حداقل رساندن مصرف حافظه کمک می کند. شما می توانید خلاصه ای از بافرهای مربوط به هر لایه را در خروجی dumpsys SurfaceFlinger .

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

رندر بوم

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

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

اولین باری که تولید کننده بافر را از BufferQueue درخواست می کند ، بافر اختصاص داده می شود و مقدار آن صفر می شود. برای جلوگیری از به اشتراک گذاشتن ناخواسته داده ها بین فرآیندها ، شروع اولیه لازم است. با این حال ، اگر از یک بافر استفاده مجدد کنید ، محتوای قبلی همچنان وجود دارد. اگر به طور مكرر بدون ترسیم كردن چیزی با lockCanvas() و unlockCanvasAndPost() تماس بگیرید ، تولیدكننده بین فریم های ارائه شده قبلی می unlockCanvasAndPost() .

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

SurfaceHolder

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

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