משטח ו- SurfaceHolder

אובייקטים משטחים מאפשרים לאפליקציות להציג תמונות על גבי מסכים. ממשקי SurfaceHolder מאפשרים לאפליקציות לערוך ולשלוט במשטחים.

משטח

משטח הוא ממשק עבור יצרן להחליף חוצצים עם צרכן.

BufferQueue עבור משטח תצוגה מוגדר בדרך כלל לאחסון משולש. מאגרים מוקצים לפי דרישה, כך שאם המפיק מייצר מאגרים לאט מספיק, כמו 30 פריימים לשנייה בתצוגה של 60 פריימים לשנייה, ייתכן שיהיו רק שני מאגרים מוקצים בתור. הקצאת מאגרים לפי דרישה עוזרת למזער את צריכת הזיכרון. אתה יכול לראות סיכום של המאגרים המשויכים לכל שכבה בפלט של dumpsys SurfaceFlinger .

רוב הלקוחות מעבדים על משטחים באמצעות OpenGL ES או Vulkan . עם זאת, חלק מהלקוחות מעבדים על משטחים באמצעות קנבס.

עיבוד קנבס

יישום הקנבס מסופק על ידי הספרייה הגרפית של Skia . אם אתה רוצה לצייר מלבן, אתה קורא ל-Canvas API, אשר מגדיר בתים במאגר בצורה מתאימה. כדי להבטיח שמאגר לא יעודכן על ידי שני לקוחות בו-זמנית, או נכתב אליו בזמן הצגתו, נעל את המאגר כדי לגשת אליו. השתמש בפקודות הבאות כדי לעבוד עם מנעולי קנבס:

  • lockCanvas() נועל את המאגר לעיבוד במעבד ומחזיר Canvas לשימוש לציור.
  • unlockCanvasAndPost() פותח את המאגר ושולח אותו ל-compositor.
  • lockHardwareCanvas() נועל את המאגר לעיבוד ב-GPU ומחזיר קנבס לשימוש לציור.

בפעם הראשונה שהמפיק מבקש מאגר מ-BufferQueue, המאגר מוקצה ומאוחל לאפס. אתחול הכרחי כדי להימנע משיתוף נתונים בשוגג בין תהליכים. עם זאת, אם אתה עושה שימוש חוזר במאגר, התוכן הקודם עדיין קיים. אם אתה קורא שוב ושוב ל- lockCanvas() ול- unlockCanvasAndPost() מבלי לצייר דבר, המפיק עובר במחזוריות בין מסגרות שעובדו בעבר.

קוד הנעילה/ביטול הנעילה של פני השטח שומר הפניה למאגר שבוצע בעבר. אם אתה מציין אזור מלוכלך בעת נעילת המשטח, הוא מעתיק את הפיקסלים הלא מלוכלכים מהמאגר הקודם. SurfaceFlinger או HWC מטפלים בדרך כלל במאגר; אבל בגלל שאנחנו צריכים רק לקרוא מהמאגר, אין צורך לחכות לגישה בלעדית.

מחזיק משטח

SurfaceHolder הוא ממשק שהמערכת משתמשת בו כדי לחלוק בעלות על משטחים עם אפליקציות. חלק מהלקוחות שעובדים עם משטחים רוצים SurfaceHolder, מכיוון שממשקי API לקבל ולהגדיר פרמטרים משטחים מיושמים דרך SurfaceHolder. SurfaceView מכיל SurfaceHolder.

רוב הרכיבים המקיימים אינטראקציה עם תצוגה כוללים SurfaceHolder. כמה ממשקי API אחרים, כגון MediaCodec, פועלים על פני השטח עצמו.