سطح و SurfaceHolder

تعمل الكائنات السطحية على تمكين التطبيقات من عرض الصور ليتم عرضها على الشاشات. تعمل واجهات SurfaceHolder على تمكين التطبيقات من تحرير الأسطح والتحكم فيها.

سطح

السطح عبارة عن واجهة للمنتج لتبادل المخازن المؤقتة مع المستهلك.

عادةً ما يتم تكوين BufferQueue لسطح العرض للتخزين المؤقت الثلاثي. يتم تخصيص المخازن المؤقتة عند الطلب، لذا إذا قام المنتج بإنشاء مخازن مؤقتة ببطء كافٍ، مثل 30 إطارًا في الثانية على شاشة عرض بمعدل 60 إطارًا في الثانية، فقد يكون هناك مخزنان مؤقتان مخصصان فقط في قائمة الانتظار. يساعد تخصيص المخازن المؤقتة عند الطلب على تقليل استهلاك الذاكرة. يمكنك الاطلاع على ملخص للمخازن المؤقتة المرتبطة بكل طبقة في مخرجات dumpsys SurfaceFlinger .

يتم عرض معظم العملاء على الأسطح باستخدام OpenGL ES أو Vulkan . ومع ذلك، يقوم بعض العملاء بالعرض على الأسطح باستخدام لوحة قماشية.

تقديم قماش

يتم توفير تطبيق اللوحة القماشية بواسطة مكتبة الرسومات Skia . إذا كنت تريد رسم مستطيل، يمكنك استدعاء Canvas API، الذي يقوم بتعيين البايتات في المخزن المؤقت بشكل مناسب. للتأكد من عدم تحديث المخزن المؤقت من قبل عميلين في وقت واحد، أو عدم الكتابة إليه أثناء عرضه، قم بقفل المخزن المؤقت للوصول إليه. استخدم الأوامر التالية للعمل مع أقفال اللوحة القماشية:

  • يقوم lockCanvas() بتأمين المخزن المؤقت للعرض على وحدة المعالجة المركزية وإرجاع Canvas لاستخدامه في الرسم.
  • unlockCanvasAndPost() يفتح المخزن المؤقت ويرسله إلى المنضد.
  • يقوم lockHardwareCanvas() بتأمين المخزن المؤقت للعرض على وحدة معالجة الرسومات وإرجاع لوحة قماشية لاستخدامها في الرسم.

في المرة الأولى التي يطلب فيها المنتج مخزنًا مؤقتًا من BufferQueue، يتم تخصيص المخزن المؤقت وتهيئته إلى الصفر. تعد التهيئة ضرورية لتجنب مشاركة البيانات بين العمليات عن غير قصد. ومع ذلك، إذا قمت بإعادة استخدام المخزن المؤقت، فستظل المحتويات السابقة موجودة. إذا قمت باستدعاء lockCanvas() و unlockCanvasAndPost() بشكل متكرر دون رسم أي شيء، فسيقوم المنتج بالتنقل بين الإطارات التي تم عرضها مسبقًا.

يحتفظ رمز قفل/فتح السطح بمرجع إلى المخزن المؤقت الذي تم تقديمه مسبقًا. إذا قمت بتحديد منطقة متسخة عند قفل السطح، فسيتم نسخ وحدات البكسل غير المتسخة من المخزن المؤقت السابق. عادةً ما يتعامل SurfaceFlinger أو HWC مع المخزن المؤقت؛ ولكن نظرًا لأننا نحتاج فقط إلى القراءة من المخزن المؤقت، فلا داعي لانتظار الوصول الحصري.

SurfaceHolder

SurfaceHolder عبارة عن واجهة يستخدمها النظام لمشاركة ملكية الأسطح مع التطبيقات. يريد بعض العملاء الذين يعملون مع الأسطح SurfaceHolder، لأنه يتم تنفيذ واجهات برمجة التطبيقات للحصول على معلمات السطح وتعيينها من خلال SurfaceHolder. يحتوي SurfaceView على SurfaceHolder.

تشتمل معظم المكونات التي تتفاعل مع طريقة العرض على SurfaceHolder. تعمل بعض واجهات برمجة التطبيقات الأخرى، مثل MediaCodec، على السطح نفسه.