Overdraw هو إعادة رسم مفرطة لنفس وحدات البكسل عدة مرات في الإطار الواحد. عندما يتم عرض واجهة معقدة تحتوي على العديد من العناصر المتداخلة على الشاشة، تضطر GPU إلى معالجة كل بكسل بشكل متكرر، مما يؤثر مباشرة على معدل الإطارات واستهلاك الطاقة. وفقًا لوثائق Google Android Developer، 2025، يمكن أن يؤدي تقليل overdraw بنسبة 50% إلى زيادة أداء العرض بنسبة تصل إلى 30%. يعد تحسين overdraw خطوة إلزامية عند تطوير تطبيقات ذات رسوم متحركة سلسة وواجهات سريعة الاستجابة.
النقاط الرئيسية
Overdraw هو حالة يتم فيها إعادة رسم نفس البكسل على الشاشة عدة مرات داخل إطار عرض واحد. في السيناريو المثالي، يجب كتابة كل بكسل مرة واحدة بالضبط، ولكن في الواجهات الحقيقية بسبب المشاهدات المتداخلة والصور الخلفية والطبقات الشفافة، تقوم GPU بكتابات متكررة.
كل إعادة رسم إضافية تزيد من وقت عرض الإطار. عند معدل 60 إطارًا في الثانية القياسي، يتوفر لكل إطار حوالي 16.6 مللي ثانية. إذا تسبب overdraw في تجاوز هذا الحد، ينخفض معدل الإطارات إلى 30 إطارًا في الثانية أو أقل، مما يضعف سلاسة الواجهة بشكل ملحوظ.
وفقًا لأنماط أداء Android من Google، فإن التطبيق الذي يحتوي على عامل overdraw 3x ينفق ثلاثة أضعاف الوقت على تظليل الأجزاء مقارنة بالتطبيق الذي يحتوي على overdraw 1x. على أجهزة GPU منخفضة الأداء، يؤدي هذا إلى تأخيرات ملحوظة أثناء التمرير والرسوم المتحركة.
بالنسبة لمطوري التطبيقات المحمولة، فإن فهم overdraw أمر بالغ الأهمية: هذا العامل هو الأكثر تسببًا في التمرير المتقطع وانخفاض معدلات الإطارات في الشاشات البسيطة ظاهريًا التي تحتوي على عدد كبير من العناصر المتداخلة.
يتكون خط أنابيب GPU من عدة مراحل: تظليل الرؤوس، التنقيط وتظليل الأجزاء. تظليل الأجزاء هو الجزء الأكثر تكلفة، حيث يتم تنفيذه لكل بكسل من كل بدائية. مع overdraw 2x، يعالج تظليل الأجزاء ضعف عدد البكسلات، مما يزيد وقت الإطار مباشرة.
تحتوي وحدات GPU المحمولة الحديثة مثل Qualcomm Adreno و Apple GPU على آليات اختبار Early-Z وإزالة الأسطح المخفية التي تعوض جزئيًا عن overdraw. ومع ذلك، تعمل هذه التحسينات فقط في ظل ظروف معينة، ولا ينبغي الاعتماد فقط على تسريع الأجهزة.
على سبيل المثال، عند عرض عناصر شبه شفافة، فإن Early-Z للأجهزة غير فعال، ويتم معالجة كل بكسل بالكامل — يمكن أن يصل overdraw في مثل هذه السيناريوهات إلى 5x أو أكثر.
الخلفيات متعددة الطبقات هي أحد الأسباب الرئيسية لـ overdraw في التطبيقات المحمولة. عندما تقوم Activity أو ViewController بتعيين لون خلفية، يمكن لكل View متداخلة إضافة خلفيتها الخاصة، ويتم إعادة رسم البكسل في كل مستوى من التسلسل الهرمي.
أظهرت دراسة هندسة Uber أن إزالة الخلفيات الزائدة في تطبيق Android الخاص بهم قللت overdraw بنسبة 32% ووقت عرض الشاشة بنسبة 25%. يوجد وضع مماثل في iOS: تعيين opaque = true للمشاهدات غير الشفافة يلغي مزج ألفا ويمنع كتابات البكسلات المتعددة.
على منصة iOS، يحدث overdraw غالبًا بسبب استخدام UIStackView الشفافة و CALayer مع shouldRasterize و UIBlurEffect المتداخلة. توصي Apple بالتحقق من overdraw من خلال أداة Core Animation في XCode — فهي تظهر مناطق إعادة الرسم كتراكب أحمر.
Debug GPU Overdraw هي أداة مدمجة في Android تلون الشاشة بألوان مختلفة حسب عامل overdraw. الأرجواني يعني 1x، الأزرق — 2x، الأخضر — 3x، الوردي — 4x، الأحمر — 5x أو أكثر. يجب أن تكون الشاشة المثالية أرجوانية في الغالب.
في iOS، يتم إجراء تشخيص مماثل بواسطة أداة Core Animation في XCode Instruments. تقوم بتصور مناطق إعادة الرسم وتظهر العدد الدقيق لكتابات البكسلات في وضع Color Blended Layers. الطبقات الخضراء غير شفافة (مثالية)، والطبقات الحمراء تحتوي على شفافية وتسبب overdraw.
بعد التشخيص، من المهم قياس FPS قبل وبعد التحسين. فرق 10–15 إطارًا في الثانية عند إصلاح overdraw هو نتيجة طبيعية لشاشة معقدة تحتوي على قوائم ورسوم متحركة.
إزالة الخلفيات الزائدة هي الطريقة الأبسط والأكثر فعالية. في Android، يكفي تعيين android:windowBackground فقط للنشاط أو السمة، وليس لكل View. في iOS، يؤدي opaque = true لجميع UIView غير الشفافة إلى تقليل overdraw إلى الصفر تقريبًا لتلك العناصر.
وفقًا لمؤتمر Google I/O 2019، سمح تحسين overdraw في Google Maps بتقليل وقت عرض الإطار بنسبة 40% من خلال دمج الطبقات واستخدام ClipRect للحد من منطقة الرسم. لمطوري Android، توصي Google بالممارسات التالية:
في iOS، يتم تحقيق التحسين من خلال تكوين CALayer: تعيين masksToBounds = true يقص المحتوى خارج حدود الطبقة، و shouldRasterize يتيح التخزين المؤقت للصورة النقطية للطبقات الثابتة.
دعونا نلقي نظرة على أمثلة عملية في Kotlin و Swift توضح سيناريوهات نموذجية لإزالة overdraw. المثال الأول يظهر التحسين من خلال ClipRect في Android:
class OptimizedView@JvmOverloads constructor(
context: Context, attrs: AttributeSet? = null
) : View(context, attrs) {
override fun onDraw(canvas: Canvas) {
canvas.clipRect(
paddingLeft.toFloat(), paddingTop.toFloat(),
width - paddingRight.toFloat(), height - paddingBottom.toFloat()
)
// Draw content only within clipped area
super.onDraw(canvas)
}
}
المثال الثاني في Swift يظهر تعطيل الشفافية لطبقة إذا كان العنصر لا يجب أن يكون شبه شفاف:
class OpaqueLabel: UILabel {
override var isOpaque: Bool {
get { true }
set { }
}
override func draw(_ rect: CGRect) {
backgroundColor?.setFill()
UIRectFill(rect)
super.draw(rect)
}
}
المثال الثالث يوضح استخدام ViewStub للتحميل المؤجل للخريطة في Android. ViewStub لا يتم عرضه حتى يصبح مرئيًا، مما يلغي overdraw في مرحلة تهيئة الشاشة:
<!-- layout/activity_main.xml -->
<ViewStub
android:id="@+id/map_stub"
android:layout_width="match_parent"
android:layout_height="200dp"
android:inflatedId="@+id/map_container"
android:layout="@layout/map_fragment" />
// Inflate on demand
ViewStub stub = findViewById(R.id.map_stub)
stub?.inflate()
الأسئلة الشائعة
Overdraw هو عندما يتم إعادة رسم بكسل على الشاشة عدة مرات في إطار واحد. تخيل أنك ترسم ورقة، ثم تلصق فوقها عدة أفلام شفافة برسومات — يجب إعادة رسم الطبقات السفلية في كل مرة تتغير فيها الطبقة العلوية.
قم بتشغيل Debug GPU Overdraw في إعدادات المطور. العناصر ذات overdraw 1x تُلون بالأرجواني، 2x — بالأزرق، 3x — بالأخضر، 4x — بالوردي، 5x+ — بالأحمر. الشاشة المثالية تكون أرجوانية في الغالب بدون مناطق حمراء.
كل إعادة رسم إضافية للبكسل تتطلب استدعاء تظليل الأجزاء، الذي يعالج اللون والملمس والإضاءة. عند 60 إطارًا في الثانية، يتوفر لكل إطار 16.6 مللي ثانية — إذا أجبر overdraw GPU على معالجة 2–3 أضعاف البكسلات، يتم تجاوز الحد وينخفض FPS إلى 30.
نعم، بشكل مباشر. GPU التي تقوم بعمل زائد تستهلك طاقة أكثر. وفقًا لبحث Google، فإن تقليل overdraw من 4x إلى 1x يقلل استهلاك طاقة GPU بنسبة 35–50%، وهو ما يكون ملحوظًا بشكل خاص على الشاشات عالية الدقة.
للشاشات البسيطة — 1x–1.5x (أرجواني مع كمية صغيرة من الأزرق). للواجهات المعقدة — حتى 2x. المستويات 3x وما فوق (وردي، أحمر) تتطلب تحسينًا. توصي Google بعدم تجاوز متوسط 2.5x overdraw عبر الشاشة.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا