تسريع الأجهزة

بدءًا من نظام التشغيل Android 3.0 (المستوى 11 من واجهة برمجة التطبيقات)، يتيح مسار العرض الثنائي الأبعاد على نظام التشغيل Android تسريع الأجهزة، ما يعني أنّ جميع عمليات الرسم التي يتم إجراؤها على لوحة View في لوحة الصورة تستخدم وحدة معالجة الرسومات. بسبب الموارد المتزايدة المطلوبة لتفعيل تسريع الأجهزة، سيستهلك تطبيقك ذاكرة وصول عشوائي (RAM) أكبر.

تكون ميزة "تسريع الأجهزة" مفعَّلة بشكل تلقائي إذا كان مستوى واجهة برمجة التطبيقات المستهدف أكبر من =14، ولكن يمكن أيضًا تفعيلها بشكل صريح. إذا كان تطبيقك يستخدم طرق العرض العادية وDrawable فقط، يجب ألا يؤدي تفعيله على مستوى العالم إلى أي تأثيرات سلبية في الرسم. وبما أنّ ميزة "تسريع الأجهزة" غير متاحة في جميع عمليات الرسم الثنائي الأبعاد، قد يؤثر تفعيلها في بعض طرق العرض المخصّصة أو طلبات الرسم. وتظهر المشاكل عادةً على أنّها عناصر غير مرئية أو استثناءات أو وحدات بكسل يتم عرضها بشكل غير صحيح. لمعالجة هذه المشكلة، يمنحك نظام التشغيل Android خيار تفعيل ميزة "تسريع الأجهزة" أو إيقافها على مستويات متعددة. يُرجى الاطّلاع على التحكّم في تسريع الأجهزة.

إذا كان تطبيقك ينفّذ رسمًا مخصّصًا، اختبِر تطبيقك على أجهزة فعلية مع تفعيل ميزة "تسريع الأجهزة" لرصد أي مشاكل. يصف قسم دعم عمليات الرسم المشاكل المعروفة المتعلقة بتسريع الأجهزة وكيفية التغلب عليها.

راجع أيضًا OpenGL مع واجهات برمجة التطبيقات الخاصة بإطار العمل وRenderscript

التحكّم في تسريع الأجهزة

يمكنك التحكم في تسريع الأجهزة على المستويات التالية:

  • طلب الانضمام
  • النشاط
  • نافذة
  • عرض

مستوى التطبيق

في ملف بيان Android، أضِف السمة التالية إلى العلامة <application> لتفعيل ميزة "تسريع الأجهزة" في تطبيقك بالكامل:

<application android:hardwareAccelerated="true" ...>

مستوى النشاط

إذا كان تطبيقك لا يتصرف بشكل صحيح مع تفعيل ميزة "تسريع الأجهزة" على مستوى العالم، يمكنك التحكّم فيه للأنشطة الفردية أيضًا. لتفعيل ميزة "تسريع الأجهزة" أو إيقافها على مستوى النشاط، يمكنك استخدام السمة android:hardwareAccelerated للعنصر <activity>. يتيح المثال التالي تسريع الأجهزة للتطبيق بأكمله ولكنه يوقفه لنشاط واحد:

<application android:hardwareAccelerated="true">
    <activity ... />
    <activity android:hardwareAccelerated="false" />
</application>

مستوى النافذة

إذا كنت بحاجة إلى مزيد من التحكم الدقيق، يمكنك تفعيل ميزة "تسريع الأجهزة" لإحدى النوافذ باستخدام الرمز التالي:

Kotlin

window.setFlags(
        WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
        WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED
)

Java

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

ملاحظة: لا يمكنك حاليًا إيقاف ميزة "تسريع الأجهزة" على مستوى النوافذ.

على مستوى الملفّ الشخصي

ويمكنك إيقاف ميزة "تسريع الأجهزة" لعرض فردي في وقت التشغيل باستخدام الرمز التالي:

Kotlin

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)

Java

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

ملاحظة: لا يمكنك حاليًا تفعيل ميزة "تسريع الأجهزة" على مستوى الملف الشخصي. تحتوي الطبقات المعروضة على وظائف أخرى إلى جانب تعطيل ميزة "تسريع الأجهزة". راجع عرض الطبقات لمزيد من المعلومات حول استخداماتها.

تحديد ما إذا كان العرض مع تسريع الأجهزة

من المفيد أحيانًا أن يعرف أحد التطبيقات ما إذا كان يتم تسريعه بواسطة الأجهزة حاليًا أم لا، خاصةً بالنسبة إلى أمور مثل طرق العرض المخصّصة. ويكون هذا الإجراء مفيدًا بشكل خاص إذا كان تطبيقك ينفّذ الكثير من الرسومات المخصّصة، ولم تكن جميع العمليات متوافقة مع مسار العرض الجديد.

هناك طريقتان مختلفتان للتحقق مما إذا كان التطبيق يتم تسريعه بواسطة الأجهزة:

إذا كان عليك التحقق من رمز الرسم هذا، استخدِم Canvas.isHardwareAccelerated() بدلاً من View.isHardwareAccelerated() إن أمكن. عند إرفاق عرض بنافذة مسرَّعة على الجهاز، سيظل من الممكن رسمه باستخدام لوحة رسم مسرَّعة لا تعتمد على الأجهزة. ويحدث ذلك على سبيل المثال عند رسم عرض في صورة نقطية لأغراض التخزين المؤقت.

نماذج رسم Android

عند تفعيل ميزة "تسريع الأجهزة"، يستخدم إطار عمل Android نموذج رسم جديدًا يستخدم قوائم العرض لعرض تطبيقك على الشاشة. لفهم قوائم العرض بشكل كامل وكيفية تأثيرها في تطبيقك، من المفيد أن تفهم كيف يجذب نظام Android طرق العرض بدون تسريع الأجهزة أيضًا. تصف الأقسام التالية نماذج الرسم المستندة إلى البرامج ونماذج الرسم المسرّعة للأجهزة.

نموذج رسم يستند إلى البرامج

في نموذج رسم البرنامج، يتم رسم طرق العرض باتباع الخطوتين التاليتين:

  1. إلغاء صلاحية العرض الهرمي
  2. رسم التسلسل الهرمي

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

  • أولاً، يتطلب هذا النموذج تنفيذ الكثير من التعليمات البرمجية في كل بطاقة رسم. على سبيل المثال، إذا استدعى تطبيقك invalidate() على أحد الأزرار وكان هذا الزر يظهر فوق عرض آخر، يعيد نظام Android رسم العرض على الرغم من أنه لم يتغير.
  • المشكلة الثانية هي أنّ نموذج الرسم قد يخفي الأخطاء في تطبيقك. وبما أنّ نظام Android يعيد رسم المشاهدات عند تقاطع المنطقة غير النظيفة، قد تتم إعادة رسم طريقة عرض غيّرت المحتوى الخاص بها بدون الاستعانة بـ invalidate(). في هذه الحالة، يتم إبطال صلاحية ملف شخصي آخر للحصول على السلوك الصحيح. يمكن أن يتغيّر هذا السلوك في كل مرة تعدِّل فيها تطبيقك. ولهذا السبب، عليك دائمًا طلب الرقم invalidate() في الملفات الشخصية المخصّصة كلما عدّلت البيانات أو الحالة التي تؤثر في رمز رسم الملف الشخصي.

ملاحظة: تستدعي طرق عرض Android invalidate() تلقائيًا عند تغيير سماتها، مثل لون الخلفية أو النص في TextView.

نموذج الرسم المسرّع للأجهزة

لا يزال نظام Android يستخدم الترميزَين invalidate() وdraw() لطلب تحديثات الشاشة وعرض طرق العرض، غير أنّه يتعامل مع الرسم الفعلي بشكل مختلف. وبدلاً من تنفيذ أوامر الرسم على الفور، يسجّلها نظام Android داخل قوائم العرض التي تحتوي على ناتج رمز الرسم للتدرّج الهرمي لطريقة العرض. هناك تحسين آخر وهو أنّ نظام Android يحتاج فقط إلى تسجيل وتعديل قوائم العرض للمشاهدات التي تم وضع علامة "غير صحيح" عليها من خلال طلب invalidate(). يمكن ببساطة إعادة رسم المشاهدات التي لم يتم إبطالها من خلال إعادة إصدار قائمة العرض المسجّلة سابقًا. يحتوي نموذج الرسم الجديد على ثلاث مراحل:

  1. إلغاء صلاحية العرض الهرمي
  2. تسجيل قوائم العرض وتعديلها
  3. رسم قوائم العرض

باستخدام هذا النموذج، لا يمكنك الاعتماد على طريقة عرض تتقاطع مع المنطقة غير النظيفة لتنفيذ طريقة draw(). للتأكّد من أنّ نظام Android يسجّل قائمة عرض العرض، يجب استدعاء الدالة invalidate(). إذا نسيت تنفيذ هذا الإجراء، ستظهر طريقة العرض بالشكل نفسه حتى بعد تغييرها.

إنّ استخدام قوائم الشبكة الإعلانية مفيد أيضًا لأداء الصور المتحركة، لأنّ ضبط خصائص معيّنة، مثل ألفا أو عرض الإعلانات بالتناوب، لا يتطلب إلغاء صلاحية العرض المستهدَف (يتم إجراؤه تلقائيًا). ينطبق هذا التحسين أيضًا على طرق العرض التي تحتوي على قوائم عرض (أي طريقة عرض عندما يتم تسريع الأجهزة في التطبيق). على سبيل المثال، لنفترض أنّ السمة LinearLayout تتضمّن العلامة ListView أعلى Button. تظهر قائمة عرض LinearLayout على النحو التالي:

  • DrawDisplayList(ListView)
  • DrawDisplayList(Button)

لنفترض الآن أنّك تريد تغيير درجة تعتيم ListView. بعد استدعاء setAlpha(0.5f) على ListView، أصبحت قائمة العرض الآن تحتوي على ما يلي:

  • SaveLayerAlpha(0.5)
  • DrawDisplayList(ListView)
  • استعادة
  • DrawDisplayList(Button)

لم يتم تنفيذ رمز الرسم المعقد لـ ListView. بدلاً من ذلك، عدَّل النظام قائمة عرض LinearLayout الأبسط إلى حد كبير. في تطبيق لم يتم تفعيل ميزة "تسريع الأجهزة" فيه، يتم تنفيذ رمز الرسم لكل من القائمة والشركة الرئيسية مرة أخرى.

دعم عمليات الرسم

عند تسريع الأجهزة، يتوافق مسار العرض ثنائي الأبعاد مع عمليات الرسم Canvas الأكثر استخدامًا بالإضافة إلى العديد من العمليات الأقل استخدامًا. تتم إتاحة جميع عمليات الرسم المستخدمة لعرض التطبيقات التي يتم شحنها إلى Android، بالإضافة إلى التطبيقات المصغّرة والتنسيقات التلقائية، بالإضافة إلى التأثيرات المرئية المتقدمة الشائعة، مثل الانعكاسات والزخارف المتجانبة.

يصف الجدول التالي مستوى الدعم للعمليات المختلفة عبر مستويات واجهة برمجة التطبيقات:

مستوى واجهة برمجة التطبيقات المتوافق أولاً
لوحة
drawBitmapMesh() (مصفوفة الألوان) 18
drawImage() 23
drawPosText() 16
drawTextOnPath() 16
drawVertices() 29
setDrawFilter() 16
ClipPath() 18
ClipRegion() 18
ClipRect(Region.Op.XOR) 18
ClipRect(Region.Op.صنع) 18
ClipRect(Region.Op.Reverseval) 18
ClipRect() مع الدوران/المنظور 18
طلاء
setAntiAlias() (للنص) 18
setAntiAlias() (للخطوط) 16
setFilterBitmap() 17
setLinearText()
setMaskFilter()
setPathEffect() (للخطوط) 28
setShadowLayer() (بخلاف النص) 28
setStrokeCap() (للخطوط) 18
setStrokeCap() (للنقاط) 19
setSubpixelText() 28
إكسفيرمود
PorterDuff.Mode.DARKEN (مخزن مؤقت للإطارات) 28
PorterDuff.Mode.lightEN (مخزن مؤقت للإطارات) 28
PorterDuff.Mode.OVERLAY (framebuffer) 28
تظليل
ComposeShader في داخل ComposeShader 28
أدوات التظليل من النوع نفسه في ComposeShader 28
مصفوفة محلية على ComposeShader 18

تغيير حجم اللوحة

تم إنشاء مسار العرض ثنائي الأبعاد المسرّع للأجهزة أولاً لإتاحة الرسم بدون مقياس، مع بعض عمليات الرسم التي تؤدي إلى خفض الجودة بشكل كبير بقيم مقياس أعلى. يتم تنفيذ هذه العمليات في شكل زخارف مرسومة على مقياس 1.0، يتم تحويلها بواسطة وحدة معالجة الرسومات. بدءًا من المستوى 28 من واجهة برمجة التطبيقات، يمكن تغيير حجم جميع عمليات الرسم بدون مشاكل.

يوضِّح الجدول التالي وقت تغيير التنفيذ للتعامل مع المقاييس الكبيرة بشكل صحيح:
عملية الرسم المراد تحجيمها مستوى واجهة برمجة التطبيقات المتوافق أولاً
drawText() 18
drawPosText() 28
drawTextOnPath() 28
أشكال بسيطة* 17
أشكال معقدة* 28
drawPath() 28
طبقة التظليل 28

ملاحظة: الأشكال "البسيطة" هي drawRect() وdrawCircle() وdrawOval() وdrawRoundRect() وdrawArc() (باستخدام أوامر useCenter=false) التي يتم إصدارها باستخدام مقياس عرض لا يحتوي على تأثير PathEffect ولا تحتوي على عمليات ربط غير تلقائية (من خلال setStrokeJoin() / setStrokeMiter()). تندرج الحالات الأخرى من أوامر الرسم هذه ضمن "Complex" في الرسم البياني أعلاه.

إذا كان تطبيقك متأثرًا بأي من هذه الميزات أو القيود المفقودة، يمكنك إيقاف تسريع الأجهزة للجزء المتأثر فقط من تطبيقك عن طريق طلب setLayerType(View.LAYER_TYPE_SOFTWARE, null). وبهذه الطريقة، لا يزال بإمكانك الاستفادة من ميزة "تسريع الأجهزة" في أي مكان آخر. راجِع التحكّم في تسريع الأجهزة للحصول على مزيد من المعلومات حول كيفية تفعيل ميزة "تسريع الأجهزة" وإيقافها على مستويات مختلفة في تطبيقك.

عرض الطبقات

في جميع إصدارات Android، تمت إتاحة عرض المشاهدات في مخازن مؤقتة خارج الشاشة، إما باستخدام ذاكرة التخزين المؤقت لرسم طرق العرض أو باستخدام Canvas.saveLayer(). هناك استخدامات متعددة للمخازن المؤقتة خارج الشاشة أو الطبقات. ويمكنك استخدامها للحصول على أداء أفضل عند إضافة تأثيرات حركية إلى طرق عرض معقدة أو تطبيق تأثيرات التركيبة. على سبيل المثال، يمكنك تطبيق تأثيرات التلاشي باستخدام Canvas.saveLayer() لعرض طبقة العرض بشكل مؤقت على الطبقة ثم تركيبها مرة أخرى على الشاشة باستخدام عامل تعتيم.

بدءًا من نظام التشغيل Android 3.0 (المستوى 11 من واجهة برمجة التطبيقات)، يمكنك التحكّم بشكل أكبر في طريقة استخدام الطبقات ووقت استخدامها من خلال طريقة View.setLayerType(). وتعتمد واجهة برمجة التطبيقات هذه على معلَمتَين: نوع الطبقة التي تريد استخدامها وكائن Paint اختياري يصف كيفية تركيب الطبقة. يمكنك استخدام المعلَمة Paint لتطبيق فلاتر الألوان أو أوضاع الدمج الخاصة أو مستوى التعتيم على طبقة معيّنة. يمكن أن تستخدم طريقة العرض أحد أنواع الطبقات الثلاث:

  • LAYER_TYPE_NONE: يتم عرض العرض بشكل طبيعي ولا يدعمه مخزن مؤقت خارج الشاشة. وهذا هو الخيار التلقائي.
  • LAYER_TYPE_HARDWARE: يتم عرض طريقة العرض في الأجهزة في بنية جهاز إذا كانت سرعة التطبيق على الأجهزة. إذا لم يكن التطبيق مسرَّعًا على الجهاز، سيعمل نوع الطبقات هذا بالطريقة نفسها التي يعمل بها LAYER_TYPE_SOFTWARE.
  • LAYER_TYPE_SOFTWARE: يتم عرض طريقة العرض في البرنامج في صورة نقطية.

يعتمد نوع الطبقة التي تستخدمها على هدفك:

  • الأداء: استخدام نوع طبقة الجهاز لعرض طبقة العرض على بنية الجهاز. بعد عرض العرض في طبقة، لا يلزم تنفيذ رمز الرسم الخاص به حتى يتم استدعاء طريقة العرض invalidate(). يمكن بعد ذلك تطبيق بعض الصور المتحركة، مثل الرسوم المتحركة ألفا، مباشرةً على الطبقة، وهو ما يُعدّ أمرًا فعالاً للغاية بالنسبة إلى وحدة معالجة الرسومات.
  • المؤثرات البصرية: استخدِم نوع طبقة جهاز أو برنامج وPaint لتطبيق معالجات مرئية خاصة على طريقة عرض. على سبيل المثال، يمكنك رسم طريقة عرض بالأبيض والأسود باستخدام علامة ColorMatrixColorFilter.
  • التوافق: استخدِم نوع طبقة برامج لفرض عرض العرض في البرنامج. إذا كانت طريقة العرض التي تم تسريعها بالأجهزة (على سبيل المثال، إذا كان تطبيقك بالكامل يتم تسريعه بالأجهزة)، تواجه مشاكل في العرض، هذه طريقة سهلة للتغلب على القيود المفروضة على مسار عرض الأجهزة.

عرض الطبقات والرسوم المتحركة

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

عندما يكون عرض مستند إلى طبقة جهاز، ستتم معالجة بعض خصائصه من خلال طريقة تركيب الطبقة على الشاشة. سيكون ضبط هذه السمات إجراءً فعّالاً لأنّها لا تتطلّب إلغاء الملف الشخصي أو إعادة رسمه. تؤثر قائمة الخصائص التالية في طريقة تركيب الطبقة. يؤدي استدعاء دالة setter لأيٍّ من هذه السمات إلى إجراء البطلان على النحو الأمثل بدون إعادة رسم طريقة العرض المستهدَفة:

  • alpha: لتغيير تعتيم الطبقة
  • x وy وtranslationX وtranslationY: يغير موضع الطبقة
  • scaleX، scaleY: لتغيير حجم الطبقة
  • rotation، rotationX، rotationY: لتغيير اتجاه الطبقة في مساحة ثلاثية الأبعاد
  • pivotX، pivotY: تغيير أصل عمليات تحويل الطبقة

هذه السمات هي الأسماء التي يتم استخدامها عند إضافة تأثيرات متحركة إلى ملف شخصي باستخدام ObjectAnimator. إذا كنت تريد الوصول إلى هذه الخصائص، يمكنك طلب الدالة setter أو getter المناسبة. على سبيل المثال، لتعديل خاصية ألفا، استدعِ setAlpha(). ويوضح مقتطف الرمز التالي الطريقة الأكثر فعالية لتدوير عرض العرض ثلاثي الأبعاد حول المحور ص:

Kotlin

view.setLayerType(View.LAYER_TYPE_HARDWARE, null)
ObjectAnimator.ofFloat(view, "rotationY", 180f).start()

Java

view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
ObjectAnimator.ofFloat(view, "rotationY", 180).start();

نظرًا لأن طبقات الأجهزة تستهلك ذاكرة الفيديو، يوصى بشدة بتفعيلها لمدة الرسم المتحرك فقط ثم إيقافها بعد انتهاء الرسم المتحرك. يمكنك إنجاز ذلك باستخدام مستمعي الرسوم المتحركة:

Kotlin

view.setLayerType(View.LAYER_TYPE_HARDWARE, null)
ObjectAnimator.ofFloat(view, "rotationY", 180f).apply {
    addListener(object : AnimatorListenerAdapter() {
        override fun onAnimationEnd(animation: Animator) {
            view.setLayerType(View.LAYER_TYPE_NONE, null)
        }
    })
    start()
}

Java

view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "rotationY", 180);
animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        view.setLayerType(View.LAYER_TYPE_NONE, null);
    }
});
animator.start();

لمزيد من المعلومات حول حركة الموقع، اطّلِع على حركة الموقع.

نصائح

يمكن أن يؤدي التبديل إلى الرسومات الثنائية الأبعاد المسرّعة للأجهزة إلى تحسين الأداء فورًا، ولكن يجب عليك تصميم تطبيقك لاستخدام وحدة معالجة الرسومات بفعالية من خلال اتّباع الاقتراحات التالية:

تقليل عدد المشاهدات في تطبيقك
كلما ازداد عدد المشاهدات التي يجب أن يرسمها النظام، كانت أبطأ. ينطبق ذلك على مسار عرض البرامج أيضًا. ويُعد تقليل عدد المشاهدات إحدى أسهل الطرق لتحسين واجهة المستخدم.
تجنُّب تجاوز الحد الأقصى
لا ترسم الكثير من الطبقات فوق بعضها. وأزِل أي طرق عرض تحجبها العروض الأخرى المبهمة فوقها بالكامل. إذا كنت بحاجة إلى رسم عدة طبقات ممزوجة فوق بعضها البعض، ننصحك بدمجها في طبقة واحدة. من القواعد الجيدة في الأجهزة الحالية عدم رسم أكثر من 2.5 ضعف عدد وحدات البكسل على الشاشة لكل إطار (وحدات بكسل شفافة في عدد الصور النقطية).
عدم إنشاء كائنات عرض باستخدام طرق الرسم
من الأخطاء الشائعة إنشاء Paint جديدة أو Path جديدة في كل مرة يتم فيها استدعاء طريقة عرض. يؤدي ذلك إلى تشغيل أداة تجميع البيانات غير المرغوب فيها بمعدّل أكبر، كما يتجاوز ذاكرات التخزين المؤقت والتحسينات في مسار الأجهزة.
عدم تعديل الأشكال كثيرًا
على سبيل المثال، يتم عرض الأشكال والمسارات والدوائر المعقدة باستخدام أقنعة الزخرفة. في كل مرة يتم فيها إنشاء مسار أو تعديله، ينشئ مسار الأجهزة قناعًا جديدًا قد يكون مكلفًا.
عدم تعديل الصور النقطية كثيرًا
في كل مرة تغيّر محتوى صورة نقطية، يتم تحميلها مرة أخرى كزخرفة لوحدة معالجة الرسومات في المرة التالية التي ترسمها فيها.
استخدام ألفا بحرص
عندما يصبح العرض شبه شفاف باستخدام setAlpha() أو AlphaAnimation أو ObjectAnimator، يتم عرضه في ذاكرة تخزين مؤقت خارج الشاشة، ما يزيد من معدل التعبئة المطلوب. وعند تطبيق ألفا على المشاهدات الكبيرة جدًا، ننصحك بضبط نوع طبقة العرض على LAYER_TYPE_HARDWARE.