تعمل كائنات Surface على تمكين التطبيقات من عرض الصور ليتم عرضها على الشاشات. تعمل واجهات SurfaceHolder على تمكين التطبيقات من تحرير الأسطح والتحكم فيها.
سطح
السطح عبارة عن واجهة يستخدمها المنتج لتبادل المخازن المؤقتة مع المستهلك.
يتم تكوين BufferQueue لسطح العرض للتخزين المؤقت الثلاثي. يتم تخصيص المخازن المؤقتة عند الطلب ، لذلك إذا قام المنتج بإنشاء مخازن مؤقتة ببطء كافٍ ، مثل 30 إطارًا في الثانية على شاشة 60 إطارًا في الثانية ، فقد يكون هناك فقط مخازن مؤقتة مخصصة في قائمة الانتظار. يساعد تخصيص المخازن المؤقتة عند الطلب على تقليل استهلاك الذاكرة. يمكنك رؤية ملخص للمخازن المؤقتة المرتبطة بكل طبقة في إخراج dumpsys SurfaceFlinger
.
يتم عرض معظم العملاء على الأسطح باستخدام OpenGL ES أو Vulkan . ومع ذلك ، يتم عرض بعض العملاء على الأسطح باستخدام لوحة قماشية.
عرض قماش
يتم تنفيذ لوحة الرسم بواسطة مكتبة Skia Graphics Library . إذا كنت ترغب في رسم مستطيل ، يمكنك استدعاء Canvas API ، التي تحدد وحدات البايت في المخزن المؤقت بشكل مناسب. للتأكد من عدم تحديث المخزن المؤقت من قبل عميلين في وقت واحد ، أو الكتابة إليه أثناء عرضه ، قم بقفل المخزن المؤقت للوصول إليه. استخدم الأوامر التالية للعمل مع أقفال قماشية:
-
lockCanvas()
بتأمين المخزن المؤقت للعرض على وحدة المعالجة المركزية وإرجاع لوحة قماشية لاستخدامها في الرسم. - يفتح
unlockCanvasAndPost()
المخزن المؤقت ويرسله إلى المكون. -
lockHardwareCanvas()
يقفل المخزن المؤقت للعرض على وحدة معالجة الرسومات ويعيد لوحة قماشية لاستخدامها في الرسم.
في المرة الأولى التي يطلب فيها المنتج مخزنًا مؤقتًا من BufferQueue ، يتم تخصيص المخزن المؤقت وتهيئته إلى الصفر. التهيئة ضرورية لتجنب مشاركة البيانات عن غير قصد بين العمليات. ومع ذلك ، إذا قمت بإعادة استخدام مخزن مؤقت ، فإن المحتويات السابقة لا تزال موجودة. إذا قمت باستدعاء lockCanvas()
و unlockCanvasAndPost()
بشكل متكرر دون رسم أي شيء ، فإن المنتج يتنقل بين الإطارات التي تم عرضها سابقًا.
يحتفظ رمز قفل / فتح السطح بمرجع إلى المخزن المؤقت الذي تم عرضه مسبقًا. إذا قمت بتحديد منطقة قذرة عند قفل السطح ، فإنها تنسخ وحدات البكسل غير المتسخة من المخزن المؤقت السابق. عادةً ما يتعامل SurfaceFlinger أو HWC مع المخزن المؤقت ؛ ولكن نظرًا لأننا نحتاج فقط إلى القراءة من المخزن المؤقت ، فلا داعي لانتظار الوصول الحصري.
SurfaceHolder
يعد SurfaceHolder واجهة يستخدمها النظام لمشاركة ملكية الأسطح مع التطبيقات. يريد بعض العملاء الذين يعملون مع الأسطح استخدام SurfaceHolder ، لأن واجهات برمجة التطبيقات للحصول على معلمات السطح وتعيينها يتم تنفيذها من خلال SurfaceHolder. يحتوي SurfaceView على SurfaceHolder.
معظم المكونات التي تتفاعل مع طريقة العرض تتضمن SurfaceHolder. تعمل بعض واجهات برمجة التطبيقات الأخرى ، مثل MediaCodec ، على السطح نفسه.