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