توضّح هذه الصفحة ما هو العرض الزائد للبكسل وكيفية تشخيصه وطرق إزالته أو التخفيف منه.
عندما يرسم أحد التطبيقات البكسل نفسه أكثر من مرة في إطار واحد، يُعرف ذلك باسم عرض زائد للبكسل. عادةً ما يكون تجاوز حدّ وحدة معالجة الرسومات غير ضروري، ومن الأفضل إزالته. يصبح تجاوز حدّ وحدة معالجة الرسومات مشكلة في الأداء عندما يستهلك وقت وحدة معالجة الرسومات لعرض بكسلات لا تساهم في ما يراه المستخدم على الشاشة.
لمحة عن تجاوز حدّ وحدة معالجة الرسومات
يشير تجاوز حدّ وحدة معالجة الرسومات إلى رسم النظام لبكسل على الشاشة عدة مرات في إطار عرض واحد. على سبيل المثال، إذا كان لديك مجموعة من بطاقات واجهة المستخدم، تخفي كل بطاقة جزءًا من البطاقة التي أسفلها. ومع ذلك، لا يزال النظام بحاجة إلى رسم الأجزاء المخفية من البطاقات في المجموعة. ويعود السبب في ذلك إلى أنّه يتم عرض البطاقات المكدّسة وفقًا لـ خوارزمية الرسام، أي بترتيب من الخلف إلى الأمام. يسمح هذا التسلسل من العرض للنظام بتطبيق مزج ألفا المناسب على العناصر الشفافة، مثل الظلال.
العثور على مشاكل العرض الزائد للبكسل
توفّر المنصة الأدوات التالية لمساعدتك في تحديد ما إذا كان العرض الزائد للبكسل يؤثر في أداء تطبيقك.
أداة "تصحيح تجاوز حدّ وحدة معالجة الرسومات"
تستخدم أداة "تصحيح تجاوز حدّ وحدة معالجة الرسومات" ترميزًا بالألوان لعرض عدد المرات التي يرسم فيها تطبيقك كل بكسل على الشاشة. كلما زاد هذا العدد، زاد احتمال تأثير العرض الزائد للبكسل في أداء تطبيقك.
لمزيد من المعلومات، يُرجى الاطّلاع على مقالة عرض تجاوز حدّ وحدة معالجة الرسومات.
أداة "رسم مخطط لعرض GPU"
تعرض أداة "رسم مخطط لعرض GPU" الوقت الذي تستغرقه كل مرحلة من مراحل خط أنابيب العرض لعرض إطار واحد على شكل مدرّج تكراري متحرّك. يعرض الجزء المعالجة من كل شريط، والمشار إليه باللون البرتقالي، الوقت الذي يبدّل فيه النظام المخازن المؤقتة. يوفّر هذا المقياس مؤشرات مهمة حول العرض الزائد للبكسل.
في وحدات معالجة الرسومات الأقل أداءً، يمكن أن يكون معدّل التعبئة المتاح منخفضًا، وهو السرعة التي يمكن لوحدة معالجة الرسومات بها ملء المخزن المؤقت للإطار. مع زيادة عدد البكسلات المطلوبة لرسم إطار، قد تستغرق وحدة معالجة الرسومات وقتًا أطول لمعالجة الأوامر الجديدة وتطلب من بقية النظام الانتظار إلى أن تتمكن من اللحاق بالركب. يعرض شريط المعالجة هذه الزيادة المفاجئة عندما تكون وحدة معالجة الرسومات مثقلة بمحاولة رسم البكسلات بأسرع ما يمكن. قد تؤدي مشاكل أخرى غير الأعداد الأولية للبكسلات أيضًا إلى زيادة هذا المقياس بشكل كبير. على سبيل المثال، إذا كانت أداة "تصحيح تجاوز حدّ وحدة معالجة الرسومات" تعرض تجاوزًا كبيرًا لحدّ وحدة معالجة الرسومات وزيادات مفاجئة في المعالجة، فمن المحتمل أن تكون هناك مشكلة في تجاوز حدّ وحدة معالجة الرسومات.
لمزيد من المعلومات، يُرجى الاطّلاع على مقالة رسم مخطط لسرعة عرض GPU.
إصلاح العرض الزائد للبكسل
يمكنك إجراء ما يلي لتقليل العرض الزائد للبكسل أو إزالته:
- إزالة الخلفيات غير الضرورية في التنسيقات
- تقليل الشفافية
يوفّر هذا القسم معلومات عن كلا الطريقتَين.
إزالة الخلفيات غير الضرورية في التنسيقات
لا يتضمّن التنسيق خلفية تلقائيًا، ما يعني أنّه لا يعرض أي شيء بنفسه مباشرةً. ومع ذلك، عندما تتضمّن التنسيقات خلفيات، قد تساهم في عرض زائد للبكسل.
يمكنك تحسين أداء العرض عن طريق إزالة الخلفيات غير الضرورية، مثل الخلفية غير المرئية لأنّ كل ما يرسمه التطبيق فوقها يغطيها بالكامل. على سبيل المثال، قد يغطي عنصر Box ثانوي أو تنسيق
يتضمّن المعدِّل .background خلفية حاوية رئيسية بالكامل، ما يجعل عملية رسم الحاوية الرئيسية غير مرئية تمامًا للمستخدم
ولكن لا تزال وحدة معالجة الرسومات تعالجها بالكامل.
لمعرفة سبب تجاوز حدّ وحدة معالجة الرسومات، اطّلِع على شجرة المكوّنات في أداة "فحص التنسيق". يمكنك البحث عن الخلفيات غير المرئية للمستخدم وإزالتها. يمكنك أيضًا إزالة الخلفيات غير الضرورية في أي مكان توجد فيه حاويات متعددة تشترك في لون الخلفية. اضبط خلفية النافذة على لون الخلفية الرئيسي لتطبيقك واترك جميع الحاويات أعلاه بدون تحديد أي قيم للخلفية.
تقليل الشفافية
يُعدّ عرض البكسلات الشفافة على الشاشة، المعروف باسم عرض ألفا، مساهمًا رئيسيًا في تجاوز حدّ وحدة معالجة الرسومات. على عكس تجاوز حدّ وحدة معالجة الرسومات العادي، عندما يخفي النظام تمامًا البكسلات المرسومة الحالية عن طريق رسم بكسلات غير شفافة فوقها، تتطلب الكائنات الشفافة رسم البكسلات الحالية أولاً، حتى يمكن تطبيق معادلة المزج الصحيحة.
تتضمّن المؤثرات المرئية، مثل الرسوم المتحركة الشفافة والتلاشي والظلال، بعض الشفافية، وبالتالي يمكن أن تساهم بشكل كبير في عرض زائد للبكسل. يمكنك تحسين العرض الزائد للبكسل في هذه الحالات عن طريق تقليل عدد الكائنات الشفافة التي تعرضها. على سبيل المثال، يمكنك الحصول على نص رمادي عن طريق رسم نص أسود في
عنصر Text قابل للإنشاء وتطبيق قيمة ألفا شفافة باستخدام modifier
= Modifier.alpha(0.5f). ومع ذلك، يمكنك الحصول على التأثير نفسه بأداء أفضل عن طريق ضبط لون نص العنصر القابل للإنشاء مباشرةً على اللون الرمادي غير الشفاف: color = Color.Black.copy(alpha = 0.5f).
لمعرفة المزيد عن تكاليف الأداء التي تفرضها الشفافية على خط أنابيب الرسم بالكامل، يُرجى مشاهدة فيديو Hidden Costs of Transparency.