Surface وSurfaceHolder

تتيح عناصر العرض للتطبيقات عرض الصور على الشاشات. تتيح واجهات 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، على السطح نفسه.