Surface ו- SurfaceHolder

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

משטח

משטח הוא ממשק ליצרן להחלפת מאגרים עם צרכן.

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

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

עיבוד בד

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

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

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

SurfaceHolder

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

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