
في بعض الأحيان ، يمكنك أن تجد نفسك في موقف لا يستطيع فيه تطبيقك أداءً جيدًا. لذا ، إليك بعض الأدوات التي يمكنك استخدامها وأفضل الممارسات التي يمكنك تنفيذها لتحسين الأمور.
هذا هو الجزء الثاني من المقالة بناءً على الحديث الرئيسي الذي ألقاه لوك بارهام ، وهو مهندس يعمل بنظام iOS في Fyusion ومؤلف برامج تعليمية لتطوير iOS على RayWenderlich.com ، في مؤتمر مطوري الهواتف المحمولة الدولي
MBLT DEV في عام 2017.
أداة الرسوم المتحركة الأساسية
إذا كنت قد فعلت الكثير من التنميط ووجدت كل اختناقاتك ، في بعض الأحيان لا تزال هناك مشاكل في الأداء. هذا بسبب الطريقة التي تعمل بها أشياء واجهة المستخدم في نظام التشغيل iOS. في أي وقت تقوم فيه بتعيين إطارات أو إجراء UIViews ، فإن ما يحدث فعليًا تحت الغطاء هو إجراء CATransaction أو أن النظام يجعله مناسبًا لك. ويتم الحصول على هذه الشحنات إلى شيء يسمى "خادم التجسيد". خادم التقديم هو المسؤول عن تنفيذ الرسوم المتحركة. إذا قمت بإجراء animateWith: أيًا كان ذلك ، فسيحدث كل ذلك على خادم التجسيد وهو مؤشر ترابط آخر ويتعامل مع جميع الرسوم المتحركة للتطبيق.

هنا هو Time Profiler الذي يحتوي على مقياس معدل الإطار في الأعلى. وفي الجزء السفلي هو أهم خيارات التصحيح جزء. سنخبر عن أهم شيئين وأسهلهما لإصلاحهما.

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

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

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

كما ترون أنهم جميعا أصفر. على iPhone 5 فهي بطيئة بقوة. وذلك لأن العرض خارج الشاشة أسوأ بكثير من مزج ألفا. انها الأكشاك GPU. ينتهي الأمر بالحاجة إلى إجراء حسابات إضافية ذهابًا وإيابًا بين وحدة معالجة الرسومات (GPU) ووحدة المعالجة المركزية (CPU) ، بحيث تحصل على أكشاك إضافية غير ضرورية في معظم الأوقات.
مسار بيزير بدلاً من عرض المنعطفات
القاعدة التالية: لا تستخدم خاصية نصف قطر الزاوية. إذا كانت لديك طريقة عرض وقمت بتعيين view.layer.cornerRadius ، فسيكون ذلك دائمًا تقديم خارج الشاشة. بدلاً من ذلك ، يمكنك استخدام مسار bezier ونفس النوع من CGBitmap الأشياء من وقت سابق. في هذه الحالة ، سياق UIGraphics. تعمل هذه الوظيفة باستخدام UIImage وهي تأخذ حجمًا ، وتنفذ زوايا مدورة بناءً على هذا الحجم وتستخدم مسارًا بيزييرًا للقص. ثم نقطع الصورة ونعيدها من سياق UIImage. لذلك سيعيد هذا صورة تم تدويرها مسبقًا بدلاً من تقريب العرض الذي تجلس فيه الصورة.

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

إذن كيف حدث هذا؟ الشيء الوحيد الذي يؤدي إلى حدوث ذلك هو خاصية shouldRasterize لـ CALayer. إنه خيار موجود على طبقة تتيح لك تخزين مواد تم تخزينها مؤقتًا. هناك الكثير من القواعد الغريبة. مثل إذا لم يتم استخدامه في كمية معينة من المللي ثانية ، فسيترك ذاكرة التخزين المؤقت. وبعد ذلك ، إذا ترك ذاكرة التخزين المؤقت ، فسيتم عرضه على الشاشة في كل إطار. لا يستحق الفوائد المحتملة. ومن الصعب التحقق مما إذا كان هذا في الواقع يفيدك.
ملخص
تجنب التقديم خارج الشاشة ومزج ألفا إذا استطعت. مزج ألفا ضروري في بعض الأحيان. إنه أفضل من التقديم خارج الشاشة. يحدث التقديم خارج الشاشة لعدة أسباب. يمكن أن يحدث من الظل. يمكن أن يحدث من التقريب الزاوية. يمكن أن يحدث من اخفاء.
جعل وجهات النظر مبهمة عندما يكون ذلك ممكنا. لا تستخدم خاصية نصف قطر الزاوية ، استخدم مسارات بيزير بقدر ما تستطيع. أيضًا ، لا تستخدم خصائص ظل الطبقة إذا كنت تقوم بظلال النص. يمكنك استخدام NSShadow بدلاً من ذلك.
تتبع النشاط
تتبع النشاط هو نوع من إصدار مستوى أقل بكثير من شيء يقوم به مُنشئ الوقت. يمنحك عرض لجميع مؤشرات الترابط الخاصة بك وكيفية تفاعلها. وهو معقد جدا. ولكن لديها ميزات لطيفة حقا يمكنك إعدادها.
تتبع النظام
استخدم
تتبع النظام لتتبع أوقات الأحداث المحددة. يمكنك إعداد طرق لتتبع أحداث وأقسام معينة من التعليمات البرمجية ومعرفة المدة التي تستغرقها في تطبيق حقيقي. يتيح لك الحصول على معلومات دقيقة حول ما يحدث في نظامك.
- استخدم "تسجيل المشاركات" للإشارة إلى حدوث شيء مهم.
- النقاط هي أحداث فردية عندما / إذا كنت تريد أن ترى مثل حدوث رسوم متحركة أو شيء من هذا القبيل.
- المناطق لها بداية ونهاية. بالنسبة لفك تشفير الصور ، يمكنك معرفة متى تبدأ ومتى تنتهي حتى تتمكن من تقدير المدة التي استغرقتها بشكل عام.

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

إذا كنت في Object-C ، فيجب عليك استيراد رأس kdebug_signpost هذا. في Swift ، يتوفر فقط لك.

ثم يجب عليك استدعاء هذه الوظيفة ، إما kdebug_signpost أو kdebug_signpost_start و kdebug_ signpost_end. وهم يعملون خارج الكود الذي مررت به. لذلك أنشأنا هذه الأحداث الثلاثة بتلك الأرقام. ثم تمر بهذا الرقم هنا. يمكنك تمريره كائن يمثل أساسًا لهذا الحدث. ثم ، الرقم الأخير هو اللون. لذلك 2 هو مثلك تعرف الأحمر أو شيء من هذا.
لدي مشروع مثال سويفت على
جيثب . أنا نوع من الأشياء المبسطة. هناك بداية ونهاية يسهل التعامل معها.
هذا ما سيبدو بمجرد تشغيلك لعملية تتبع. لن تظهر لك أي شيء في البداية. بعد ذلك ، عندما تقتل التطبيق ، ستقوم ببعض الحسابات وتظهر لك الأشياء هنا.

يمكننا هنا مشاهدة تنزيلات الصور التي استغرقت حوالي 200 مللي ثانية. ثم ، هناك فك تشفير للصور استغرق 40 مللي ثانية. هذا رائع حقًا إذا كان لديك مجموعة من الأشياء المجنونة التي تحدث في تطبيقك. يمكنك إعداد كل هذه الأحداث ثم انظر فقط إلى قراءات المدة التي تستغرقها كل منها وكيف تتفاعل مع بعضها البعض. هذا هو لتتبع النظام.
مكافأة
ألقِ نظرة على مثال تباطؤ الكاميرا حيث يمكننا معرفة ما يحدث إذا كانت هناك أشياء AR في التطبيق:

طبقنا تأثيرًا ، واستغرقنا 26.4٪ من جميع الحسابات في كل إطار فقط لحساب تأثير واحد. وكان يبطئ الكاميرا إلى شيء مجنون مثل 10 لقطة في الثانية.
عندما دخلت هنا ونظرت إلى عنق الزجاجة الكبير ، رأيت أن أهم شيء كان يقوم به معظم العمل كان استخدام NSDispatchData المكثف.

هذه هي فئة فرعية من NSData. وكل هذا هو الحصول على بايت مع وظيفة النطاق. وهذه هي وظيفة بسيطة. كل ما تفعله هو أنه يأخذ بعض البايتات من البيانات ويضعها في مكان آخر. إنها ليست مجنونة للغاية ، لكن ، على ما يبدو ، كل الأشياء التي كانت تقوم بها داخليًا كانت تستحوذ على 18٪ من هذه النسبة البالغة 26٪.
القاعدة رقم 1إنها NSData وهي تحصل على وحدات البايت. هذا شيء بسيط Objective-C ولكن إذا واجهت ذلك وكان عنق الزجاجة ، فقد حان الوقت للتبديل إلى استخدام C بدلاً من ذلك. نظرًا لأن عنق الزجاجة كان حول مكالمة واحدة للاستيلاء على قيم التعويم ، يمكنك فقط استخدام memcpy (). مع memcpy () يمكنك نقل جزء كبير من البيانات في مكان آخر. يقطع الكثير من النفقات العامة.
إذا نظرت إلى مثل NSData ، فإن هذه الفئات تشبه آلاف الخطوط. لذلك هناك الكثير من الأشياء التي تحدث هناك. في هذه الحالة ، لدينا الأصلي باللون الأحمر.

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

عندما نغير ذلك ونعمل عليه مرة أخرى ، فإن الأمور انتقلت من 26 ٪ إلى 0.6 ٪ عن طريق تغيير هذا السطر إلى memcpy (). وبعد ذلك ، قفز معدل الإطار بشكل كبير.
القاعدة رقم 2تجنب السحب الزائد إذا كنت تقوم بنوع من تطبيق التقديم أو حتى إذا كنت تفعل شيئًا مثل شريط التحميل. في كثير من الأحيان ستحدث الأحداث أكثر من 60 لقطة في الثانية الواحدة. في هذه الحالة ، يمكنك إخماد هذا التحديث لواجهة المستخدم باستخدام CADisplayLink. لديها خاصية تسمى preferFramesPerSecond. هذا هو فقط لنظام التشغيل iOS 10 أو أعلى. للأكبر سنا ، عليك أن تفعل ذلك يدويا لكنها لا تزال مفيدة.

يمكنك ضبط فراميراتي المطلوب. في كثير من الأحيان لمثل أشرطة التحميل ، سوف أقوم بتعيينها حوالي 15 إطارًا في الثانية لأنه لا يهم حقًا. ليس من الضروري تحديث 60 إطارًا في الثانية. هذا يمكن أن يوفر لك الكثير من العمل الذي تقوم به في الواقع إذا كانت الأمور تبدو كما هي.
القاعدة رقم 3استخدام التخزين المؤقت IMP. هذا مفيد للهدف- C فقط. InObjective-C ، عندما تقوم باستدعاء طريقة ما تحت الغطاء ، فأنت تقوم بالفعل باستدعاء وظيفة إرسال رسالة Objective-C (objc_msgSend ()). إذا كنت ترى هذه المكالمات في تتبعات تأخذ وقتًا كبيرًا من الوقت ، فهذا شيء يمكنك التخلص منه بسهولة. إنه في الأساس جدول ذاكرة التخزين المؤقت حيث تبحث عن مؤشرات الوظائف من خلال إعطائها اسمًا لبعض الطرق. بدلاً من القيام بذلك البحث في كل مرة ، يمكنك تخزين مؤشر الوظيفة وتوصيلها مباشرة. هو على الأقل مرتين بالسرعة عادة.

إذا لم يكن لديك مؤشر مؤقت ، فيمكنك الحصول عليه عن طريق استدعاء methodForSelector:. ثم نسميه فقط هذه الطريقة مثل استدعاء وظيفة عادية. يمكنك تمرير الكائن المحدد ثم تأتي أي وسيطات بعد ذلك.
القاعدة رقم 4لا تستخدم ARC. ARC شيء يضيف مجموعة من النفقات العامة. في التعليمات البرمجية الخاصة بك ، يحدث كل هذه الأشياء وهي ترش جميعها بالاحتفاظ والإصدارات. إنها تفعل الكثير بقدر ما عليها ، وهي تفعل الكثير. لذا ، إذا كنت تريد التحسين بالفعل ، إذا رأيت أن لديك مجموعة من المكالمات والإفراج عنها في تتبعك وأنها تستهلك الكثير من الوقت ، فيمكنك التبديل إلى عدم استخدام ARC الذي يعد الكثير من العمل.
من الصعب أيضًا جعل زملائك في الفريق يوافقون على القيام بذلك وألا يغضبوا منه.
لا تستخدم Swift إذا كان حساسًا بشكل خاص للأداء. سويفت هي لغة جميلة. لديها بعض الميزات أنيق حقا. ولكنه يستخدم أيضًا مزيدًا من الميزات المتطورة التي تحصل من الداخل للحصول على مستوى عالٍ من الوظائف. إذا كنت تريد أن تكون سريعًا ، فيجب أن تقترب من التجميع أقرب ما يمكن من الأشياء المنخفضة المستوى. وسيكون ذلك أسرع لأنه أقل رمزًا تلقائيًا.
إذا كنت تبحث في الأشياء إذا كنت تعتقد أنها كانت مثيرة للاهتمام ، فهناك كتاب جيد حقًا يسمى "iOS و MacOS: ضبط الأداء" للمخرج مارسيل فاير. يذهب حقا في عمق الكثير من هذه الأشياء وأكثر من ذلك بكثير الماضي. لدي أيضا سلسلة الفيديو. أفعل أشرطة الفيديو ل RayWenderlich. هناك سلسلة أدوات عملية قمت بها والتي تتعمق أكثر وتشرح هذه الأشياء أكثر قليلاً ولديها بعض الأمثلة. لذلك إذا كنت تريد معرفة المزيد حول الأدوات على وجه التحديد ، يمكنك مشاهدة سلسلة الفيديو هذه. وبعد ذلك ، مقاطع فيديو WWDC - هناك الكثير منها يوضح أشياء أداء مختلفة مثل هذا.
فيديو
هنا يمكنك العثور على الجزء الأول من مقالة تستند إلى حديث لوقا. شاهد الحديث الكامل هنا: