متوسط عدد اللقطات في الثانية
يُعدّ معدّل اللقطات في الثانية السلس والثابت أمرًا بالغ الأهمية لتقديم تجربة ألعاب عالية الجودة على أجهزة Android. عند قياس أداء اللعبة، عليك قياس متوسط عدد اللقطات في الثانية كخط أساس لتقديم فهم أساسي للتجربة. يجب تحسين لعبتك لتلبية متوسط عدد اللقطات في الثانية البالغ 60 لضمان تقديم تجربة لعب رائعة.
معدّل اللقطات في الثانية عند النسبة المئوية 90 و99 للثبات
وحتى مع توفّر معدّل 60 لقطة في الثانية في المتوسط، قد تحدث مشاكل متقطّعة في اللعبة، مثل التقطيع الدقيق وتأخّر الاستجابة غير المتوقّع، ما يؤدي إلى تقديم تجربة سيئة للاعبين.
لذلك، فإنّ ثبات اللقطات لا يقل أهمية عن تتبُّع متوسط عدد اللقطات في الثانية. وهنا يجب قياس مقياسَي عدد اللقطات في الثانية P90 وP99 باعتبارهما الحد الأدنى الثابت ومؤشر التقطّع على التوالي. تتتبّع هذه المقاييس "الجزء الأخير" من الأداء لتتمكّن من تحسين سلاسة تجربة اللاعب.
المقاييس
- متوسط عدد اللقطات في الثانية (خط الأساس): يوفّر هذا المقياس الأساسي خط أساس عامًا لأداء لعبتك. وعلى الرغم من أنّه معيار أساسي، إلا أنّ عملية حساب المتوسط تعني أنّه لا يمكن رصد انخفاض عدد اللقطات بشكل متقطع والتقطّع البسيط، ما يجعله غير كافٍ لتمثيل تجربة اللاعب بمفرده.
- عدد اللقطات في الثانية عند النسبة المئوية التسعين (مستوى أساسي ثابت عند الشريحة المئوية العاشرة): يشير هذا المقياس إلى أنّ 90% من اللقطات تجاوزت هذا المستوى الأساسي الثابت، وأنّ أبطأ 10% من اللقطات فقط استغرقت وقتًا أطول في العرض. إذا كان معدّل اللقطات في الثانية عند النسبة المئوية 90 مرتفعًا وقريبًا من المتوسط، يعني ذلك أنّ اللعبة تعمل بشكل جيد باستمرار خلال معظم مدة الجلسة.
- معدّل اللقطات في الثانية عند نسبة 99% (مؤشر التقطّع عند نسبة 1% من البيانات): يشير هذا المقياس إلى أنّ %99 من اللقطات تجاوزت مؤشر التقطّع هذا، ما يؤدي إلى عزل أبطأ %1 من اللقطات. هذا المقياس ضروري لرصد التقطّعات الصغيرة والتأخيرات في تحميل مواد العرض والارتفاعات المفاجئة في عرض مواد العرض الكثيفة التي تتسبّب في حدوث مشاكل مرئية.
أمثلة
من خلال مقارنة متوسط عدد اللقطات في الثانية بمقياسَي P90 وP99، يمكنك تحديد السلوك الأساسي للعبة بدقة.
السيناريو 1: منحنى مثالي (لعبة محسّنة)
- المتوسط: 60 لقطة في الثانية (16.6 ملي ثانية)
- P90: 58 لقطة في الثانية (17.2 ملي ثانية)
- P99: 52 لقطة في الثانية (19.2 ملي ثانية)
- التحليل: المقاييس مجمّعة بإحكام. تبدو اللعبة سلسة ومتّسقة بشكل لا يُصدّق. لا تحدث أي تقطّعات صغيرة، وحتى أسوأ% 1 من اللقطات لا يمكن ملاحظتها بالعين المجردة.
السيناريو 2: عنق الزجاجة في التحميل (الحد الأقصى لوحدة المعالجة المركزية/وحدة معالجة الرسومات)
- المتوسط: 45 لقطة في الثانية (22.2 ملي ثانية)
- P90: 40 لقطة في الثانية (25.0 ملي ثانية)
- P99: 38 لقطة في الثانية (26.3 ملي ثانية)
- التحليل: معدّل اللقطات في الثانية أقل من المتوسط، ولكنّه ثابت. لا ينخفض معدّل اللقطات في الثانية عند النسبة المئوية 99 بشكل كبير مقارنةً بالمتوسط، ما يشير إلى أنّ النظام مثقل بشكل أساسي بإعدادات الرسومات أو قيود الدقة. لن تشعر بأنّ اللعبة تتقطّع، بل ستكون بطيئة. وعادةً ما يؤدي خفض إعدادات الرسومات إلى زيادة هذه المقاييس بشكل موحّد.
السيناريو 3: معدل 60 لقطة غير ثابت في الثانية (توقفات متقطّعة بسبب تجميع أدوات التظليل / نقل مواد العرض)
- المتوسط: 60 لقطة في الثانية (16.6 ملي ثانية)
- P90: 45 لقطة في الثانية (22.2 ملي ثانية)
- P99: 15 لقطة في الثانية (66.6 ملي ثانية)
- التحليل: هذا هو أسوأ سيناريو. على الرغم من أنّ متوسط عدد اللقطات في الثانية يبدو ممتازًا، فإنّ مقياس P99 يكشف عن مشكلة حرجة. يشير معدّل P99 البالغ 66.6 ملي ثانية إلى أنّ اللعبة تتوقّف تمامًا لعدة لقطات في المرة الواحدة. يشير ذلك إلى القيم المتطرفة الشديدة، والتي تحدث عادةً بسبب اختناقات وحدة المعالجة المركزية أو تأخيرات في بث مواد العرض (على سبيل المثال، بطء ذاكرة الوصول العشوائي أو التخزين) أو أخطاء ناتجة عن تجميع برامج التظليل.
القياس
لقياس متوسط عدد اللقطات في الثانية وP90 وP99 لعدد اللقطات في الثانية بفعالية، يمكنك استخدام الطريقتَين التاليتَين. الطريقة الأولى هي تحليل عمليات تتبُّع النظام باستخدام أداة Android Performance Analyzer (APA)، وهي أداة لتحديد الأداء. الطريقة الثانية هي استخدام الأمر adb dumpsys SurfaceFlinger --timestats الحالي.
1. القياس باستخدام APA
باستخدام APA، يمكنك تسجيل تتبُّع النظام وتحليل بيانات الإطارات بدقة من خلال طلبات بحث SQL. اتّبِع الخطوات التالية لقياس مقاييسك:
تسجيل عملية التتبُّع باستخدام APA: شغِّل لعبتك واستخدِم APA لتسجيل عملية تتبُّع النظام خلال الجزء الذي تريد تحليله (على سبيل المثال، نقطة أثناء اللعب تشك في حدوث انخفاض في عدد اللقطات فيها). بعد ربط الجهاز واكتمال تسجيل التتبُّع، سيتم تحميل بيانات التتبُّع في واجهة APA.
شاشة التقاط التتبُّع أو شاشة التتبُّع التي تم تحميلها النقر على علامة التبويب "SQL" في APA: بعد فتح شاشة تحليل التتبُّع، انقر على علامة التبويب SQL في أعلى منطقة التنقّل أو في الجانب من واجهة المستخدِم لفتح بيئة معالجة التتبُّع، حيث يمكنك الاستعلام عن البيانات مباشرةً.
لصق استعلام SQL في علامة التبويب APA SQL: انسخ استعلام SQL التالي والصِقه في حقل إدخال الاستعلام. يحدّد هذا الطلب عملية SurfaceFlinger، ويحسب الفواصل الزمنية بين اللقطات استنادًا إلى الطوابع الزمنية الفعلية لتعديل الشاشة، ويستنتج متوسط عدد اللقطات في الثانية، وأقل 10% من عدد اللقطات في الثانية (P90)، وأقل 1% من عدد اللقطات في الثانية (P99).
WITH target_process AS ( -- 1. Get SurfaceFlinger process ID where frames were identified in debugging step 3 SELECT upid FROM process WHERE name = '/system/bin/surfaceflinger' ), actual_present_times AS ( -- 2. Calculate the hardware display timestamps when SurfaceFlinger actually updated the screen SELECT (ts + dur) AS present_ts FROM actual_frame_timeline_slice WHERE upid IN (SELECT upid FROM target_process) AND dur > 0 ), present_intervals AS ( -- 3. Calculate intervals between physical screen refreshes SELECT (LEAD(present_ts) OVER (ORDER BY present_ts ASC) - present_ts) / 1000000.0 AS p2p_ms FROM actual_present_times ), valid_intervals AS ( -- 4. Filter for valid frame intervals SELECT p2p_ms FROM present_intervals WHERE p2p_ms IS NOT NULL AND p2p_ms > 0 ), ordered_frames AS ( -- 5. Sort in ascending order to calculate percentiles SELECT p2p_ms, ROW_NUMBER() OVER (ORDER BY p2p_ms ASC) AS row_num, COUNT(1) OVER () AS total_frames FROM valid_intervals ) -- 6. Output final metrics SELECT (SELECT COUNT(1) FROM valid_intervals) AS total_presented_frames, ROUND(1000.0 / NULLIF((SELECT AVG(p2p_ms) FROM valid_intervals), 0), 2) AS average_fps, ROUND(1000.0 / NULLIF((SELECT p2p_ms FROM ordered_frames WHERE row_num = CAST(total_frames * 0.90 AS INT)), 0), 2) AS low_10_fps, ROUND(1000.0 / NULLIF((SELECT p2p_ms FROM ordered_frames WHERE row_num = CAST(total_frames * 0.99 AS INT)), 0), 2) AS low_1_fps;انقر على "تنفيذ طلب البحث": انقر على الزر تنفيذ طلب البحث (أو رمز التنفيذ) بجانب حقل إدخال طلب البحث. بعد اكتمال تنفيذ طلب البحث، سيتم عرض إجمالي عدد اللقطات التي تم قياسها (
total_presented_frames) ومتوسط عدد اللقطات في الثانية (average_fps) وعدد اللقطات في الثانية ضمن أدنى% 10 (low_10_fps) وعدد اللقطات في الثانية ضمن أدنى% 1 (low_1_fps) في جدول ضمن لوحة النتائج.
شاشة تعرض طلب بحث SQL الذي تم تنفيذه والمقاييس الأربعة الناتجة المعروضة في جدول
2. القياس باستخدام adb (dumpsys SurfaceFlinger)
لقياس متوسط عدد اللقطات في الثانية وP90 وP99 بفعالية، يمكنك استخدام الأمر timestats surfaceflinger dumpsys في Android. توفّر هذه الأداة متوسط عدد اللقطات في الثانية ومخططًا بيانيًا presentToPresent للوقت لجميع الطبقات التي يتم عرضها. ووقت presentToPresent للقطة هو الفاصل الزمني بين اللقطة الحالية واللقطة السابقة التي يتم رسمها.
في ما يلي تعليمات خطوة بخطوة لجمع هذه المقاييس واحتسابها في لعبتك:
بدء التسجيل: شغِّل الأمر التالي مع علامتَي enable وclear لبدء تسجيل المعلومات:
adb shell dumpsys SurfaceFlinger --timestats -clear -enableمعلومات التفريغ: بعد لعب اللعبة لمدة كافية، شغِّل الأمر مرة أخرى مع علامة التفريغ لعرض المعلومات:
adb shell dumpsys SurfaceFlinger --timestats -dumpالفلترة حسب الطبقة: تقدّم المعلومات التي تم تفريغها بيانات لجميع الطبقات التي يعرضها SurfaceFlinger. يجب العثور على القسم الذي يتوافق مع لعبتك من خلال الفلترة استنادًا إلى
layerName(على سبيل المثال، layerName = SurfaceView[com.example.yourgame...]).layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833تحديد متوسط عدد اللقطات في الثانية: يتم احتساب متوسط عدد اللقطات في الثانية لكل طبقة تلقائيًا ويظهر مباشرةً في ناتج التفريغ (على سبيل المثال، averageFPS = 30.179).
... averageFPS = 30.179 ...احتساب مقياسَي P90 وP99 لعدد اللقطات في الثانية: للعثور على مقياسَي P90 وP99، عليك تحليل totalFrames والمدرّج التكراري لتوقيت
presentToPresentالمتوفّر في ملف التفريغ.totalFrames = 1000 ... presentToPresent histogram is as below: 0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0 13ms=0 14ms=0 15ms=0 16ms=850 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0 24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=100 34ms=0 36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=35 54ms=0 58ms=0 62ms=0 66ms=10 70ms=0 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=5 106ms=0 110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0 150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0 650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0(أ). مثال توضيحي (جدول التوزيع التراكمي) لنفترض أنّ جلسة لعبتك سجّلت إجمالي عدد إطارات يبلغ 1,000. للعثور على P90 وP99، عليك احتساب الحدود الدنيا بالملّي ثانية التي يصل فيها عدد اللقطات التراكمي إلى 900 لقطة (90%) و990 لقطة (99%) على التوالي، مع احتساب القيم من أدنى مجموعة من الملّي ثانية.
وقت عرض اللقطة (بالمللي ثانية) عدد اللقطات (مدرّج تكراري) عدد اللقطات التراكمي حالة النسبة المئوية / طريقة الاحتساب 16 ملي ثانية 850 850 85.0% 33ms 100 950 95.0%
(تم تحقيق هدف P90 البالغ 900 نقطة! → 1000/33 = 30.3 لقطة في الثانية)50 ملي ثانية 35 985 98.5% 66ms 10 995 99.5%
(تم بلوغ هدف P99 البالغ 990 ← 1000/66 = 15.1 لقطة في الثانية)102 ملي ثانية 5 1,000 100% (ب). منطق التنفيذ (الرمز الزائف) إذا كنت بصدد تنفيذ هذه العملية آليًا باستخدام نص Python البرمجي أو محلّل السجلات، يمكن تنفيذ منطق استخراج قيم P90 وP99 من الرسم البياني المدرّج على النحو التالي:
# Define target thresholds based on total frame count p90_target = totalFrames * 0.90 p99_target = totalFrames * 0.99 cumulative_frames = 0 p90_fps = None p99_fps = None # Iterate through the parsed SurfaceFlinger histogram data (sorted by millisecond) for ms_bucket, frame_count in present_to_present_histogram: cumulative_frames += frame_count # Capture P90 when cumulative frames cross the 90% threshold if p90_fps is None and cumulative_frames >= p90_target: p90_fps = 1000 / ms_bucket # Capture P99 when cumulative frames cross the 99% threshold if p99_fps is None and cumulative_frames >= p99_target: p99_fps = 1000 / ms_bucket break # Optimization: stop iterating once both targets are foundإيقاف التسجيل: بعد جمع كل المعلومات اللازمة، عليك إيقاف timestats باستخدام علامة الإيقاف:
adb shell dumpsys SurfaceFlinger --timestats -disable
الجلسات البطيئة
تحدّد الجلسات البطيئة مشاكل الأداء الشائعة في العالم الحقيقي. وتُصنّف الجلسة على أنّها "بطيئة" إذا انخفضت أكثر من% 25 من اللقطات إلى ما دون الحدّ الأدنى (على سبيل المثال، 20 لقطة في الثانية). وعلى الرغم من أنّ هذا المقياس مفيد في رصد المشاكل الحرجة في الإصدار، لا يمكنه وحده ضمان تقديم تجربة مستدامة وعالية الجودة. فقد تتجنّب اللعبة الحدّ الأدنى للجلسات البطيئة، ولكنها قد تعاني من تقطّع بسيط يؤثر في تجربة 60 لقطة سلسة في الثانية.
مع أنّ مقياسَي "الجلسة البطيئة" و"عدد اللقطات في الثانية" مشتقّان من أوقات عرض اللقطات، إلا أنّ لكلّ منهما دورًا مختلفًا. فمقاييس عدد اللقطات في الثانية (المتوسط وP90 وP99) تقيس جودة الأداء واستدامته، وترصد الانخفاضات الفورية والوتيرة غير المتسقة التي قد يتجاهلها مقياس "الجلسة البطيئة".
الخاتمة
يتطلّب تحسين الأداء بنجاح استراتيجية شاملة. على المطوّرين استخدام ميزة "الجلسات البطيئة" كأداة رصد أساسية لرصد حالات التدهور الشديد في الأداء، ثم فحص متوسط عدد اللقطات في الثانية ومقياسَي P90 وP99 لتحديد الأسباب الأساسية والتأكّد من سلاسة اللعب الفعلية. من خلال دمج هذه المقاييس، يمكنك التأكّد من أنّ تطبيقك يقدّم تجربة مستخدم مستدامة واستثنائية بشكل دائم.
مراجع إضافية
لمزيد من المعلومات حول تقنيات إنشاء الملفات المتقدّمة، وتنفيذ واجهة برمجة التطبيقات Frame Pacing، واستراتيجيات التحسين الخاصة بالمحرك، يُرجى الاطّلاع على مستندات مطوّري Android الرسمية:
- مؤشرات Android الحيوية: الجلسات البطيئة: يمكنك التعرّف على كيفية قياس Google Play لفترات العرض البطيء المستمر والإبلاغ عنها، ما يؤثر بشكل مباشر في تجربة المستخدم. ويُقصد بـ "الجلسة البطيئة" جلسة المستخدم التي يكون فيها أكثر من% 25 من اللقطات بطيئًا (على سبيل المثال، يستغرق عرضها أكثر من 50 ملي ثانية، أي ما يعادل 20 لقطة في الثانية).
- موقع "مطوّرو تطبيقات Android": تحسين أداء الألعاب: يمكنك استكشاف المركز الرئيسي لتحسين أداء الألعاب على Android. يتناول هذا الدليل الشامل أفضل الممارسات وأدوات تحديد المشاكل (مثل APA وPerfetto) لمساعدتك في تحسين الأداء العام للعبتك إلى أقصى حد.