معدل عرض الإطارات

متوسط عدد اللقطات في الثانية

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

عدد اللقطات في الثانية عند النسبة المئوية 90 و99 لتحقيق الثبات

حتى مع متوسط عدد اللقطات في الثانية السلس البالغ 60 لقطة في الثانية، قد تستمر اللعبة في التعرّض لتأخيرات متقطّعة وتلعثمات صغيرة وتأخيرات غير متوقّعة في الإدخال، ما يؤدي إلى تجربة سيئة للاعب.

لذلك، فإنّ ثبات عدد اللقطات في الثانية لا يقل أهمية عن تتبُّع متوسط عدد اللقطات في الثانية. هنا يجب قياس مقياسَي عدد اللقطات في الثانية عند النسبة المئوية 90 و99 كمرجع ثابت ومؤشر للتلعثم على التوالي. تسجّل هذه المقاييس "الطرف السفلي" من الأداء لتحسين سلاسة تجربة اللاعب.

المقاييس

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

أمثلة

من خلال مقارنة متوسط عدد اللقطات في الثانية بمقياسَي عدد اللقطات في الثانية عند النسبة المئوية 90 و99، يمكنك تشخيص السلوك الأساسي للعبة بدقة.

السيناريو 1: منحنى مثالي (لعبة محسّنة)

  • المتوسط: 60 لقطة في الثانية (16.6 ملي ثانية)
  • النسبة المئوية 90: 58 لقطة في الثانية (17.2 ملي ثانية)
  • النسبة المئوية 99: 52 لقطة في الثانية (19.2 ملي ثانية)
  • التحليل: المقاييس متقاربة جدًا. تبدو اللعبة سلسة ومتّسقة بشكل لا يُصدّق. لا توجد تلعثمات صغيرة، وحتى% 1 من اللقطات الأسوأ لا يمكن ملاحظتها بالكاد بالعين البشرية.

السيناريو 2: عنق الزجاجة في التحميل (محدودية وحدة المعالجة المركزية/وحدة معالجة الرسومات)

  • المتوسط: 45 لقطة في الثانية (22.2 ملي ثانية)
  • النسبة المئوية 90: 40 لقطة في الثانية (25.0 ملي ثانية)
  • النسبة المئوية 99: 38 لقطة في الثانية (26.3 ملي ثانية)
  • التحليل: متوسط عدد اللقطات في الثانية أقل، ولكنّه ثابت. لا ينخفض عدد اللقطات في الثانية عند النسبة المئوية 99 بشكل كبير مقارنةً بالمتوسط. يشير ذلك إلى أنّ النظام مثقل بشكل أساسي بالإعدادات الرسومية أو قيود الدقة. لن تبدو اللعبة متقطعة، بل بطيئة. عادةً ما يؤدي خفض الإعدادات الرسومية إلى زيادة هذه المقاييس بشكل موحّد.

السيناريو 3: 60 لقطة في الثانية غير ثابتة (تجميع التظليل / التلعثمات في بث مواد العرض)

  • المتوسط: 60 لقطة في الثانية (16.6 ملي ثانية)
  • النسبة المئوية 90: 45 لقطة في الثانية (22.2 ملي ثانية)
  • النسبة المئوية 99: 15 لقطة في الثانية (66.6 ملي ثانية)
  • التحليل: هذا هو أسوأ سيناريو. على الرغم من أنّ متوسط عدد اللقطات في الثانية يبدو ممتازًا، فإنّ عدد اللقطات في الثانية عند النسبة المئوية 99 يكشف عن مشكلة حرجة. يعني عدد اللقطات في الثانية عند النسبة المئوية 99 البالغ 66.6 ملي ثانية أنّ اللعبة تتجمّد تمامًا لعدة لقطات في المرة الواحدة. يشير ذلك إلى القيم المتطرفة الشديدة، والتي تحدث عادةً بسبب عنق الزجاجة في وحدة المعالجة المركزية أو التأخيرات في بث مواد العرض (على سبيل المثال، ذاكرة الوصول العشوائي أو مساحة التخزين البطيئة) أو التأخيرات الناتجة عن تجميع التظليل.

القياس

لقياس متوسط عدد اللقطات في الثانية وعدد اللقطات في الثانية عند النسبة المئوية 90 و99 بشكل فعّال، يمكنك استخدام الأمر Android dumpsys surfaceflinger timestats. توفّر هذه الأداة متوسط عدد اللقطات في الثانية ومخططًا تكراريًا لتوقيت presentToPresent لجميع الطبقات التي يتم عرضها. إنّ وقت presentToPresent للقطة هو الفترة الفاصلة بين اللقطة الحالية واللقطة السابقة التي يتم رسمها.

في ما يلي التعليمات التفصيلية لجمع هذه المقاييس وحسابها للعبتك:

  1. بدء عملية الالتقاط: شغِّل الأمر التالي باستخدام علامتَي enable وclear لبدء التقاط المعلومات:

    adb shell dumpsys SurfaceFlinger --timestats -clear -enable
    
  2. تفريغ المعلومات: بعد تشغيل اللعبة لفترة كافية، شغِّل الـ أمر مرة أخرى باستخدام علامة dump لعرض المعلومات:

    adb shell dumpsys SurfaceFlinger --timestats -dump
    
  3. الفلترة حسب الطبقة: توفّر المعلومات التي تم تفريغها بيانات لجميع الطبقات التي يعرضها SurfaceFlinger. عليك العثور على القسم الذي يتوافق مع لعبتك من خلال الفلترة استنادًا إلى layerName (على سبيل المثال، layerName = SurfaceView[com.example.yourgame...]).

    layerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833
    
  4. تحديد متوسط عدد اللقطات في الثانية: يتم احتساب متوسط عدد اللقطات في الثانية لكل طبقة تلقائيًا ويظهر مباشرةً في ناتج التفريغ (على سبيل المثال، averageFPS = 30.179).

    ...
    averageFPS = 30.179
    ...
    
  5. حساب عدد اللقطات في الثانية عند النسبة المئوية 90 و99: للعثور على مقياسَي عدد اللقطات في الثانية عند النسبة المئوية 90 و99، عليك تحليل إجمالي اللقطات والمخطط التكراري لتوقيت 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. للعثور على عدد اللقطات في الثانية عند النسبة المئوية 90 و99، عليك احتساب الحدود الدنيا بالملّي ثانية التي يصل فيها العدد التراكمي للقطات إلى 900 لقطة (%90) و990 لقطة (%99) على التوالي، بدءًا من أقل مجموعة بالملّي ثانية.

    وقت عرض اللقطة (بالملّي ثانية) عدد اللقطات (المخطط التكراري) العدد التراكمي للقطات حالة النسبة المئوية / الحساب
    16 ملي ثانية 850 850 %85.0
    33 ملي ثانية 100 950 %95.0
    (تم بلوغ عدد اللقطات المستهدَف عند النسبة المئوية 90 البالغ 900! ← 1000/33 = 30.3 لقطة في الثانية)
    50 ملي ثانية 35 985 %98.5
    66 ملي ثانية 10 995 %99.5
    (تم بلوغ عدد اللقطات المستهدَف عند النسبة المئوية 99 البالغ 990! ← 1000/66 = 15.1 لقطة في الثانية)
    102 ملي ثانية 5 1,000 %100

    ب. منطق التنفيذ (رمز زائف) إذا كنت تُجري عملية التحليل هذه تلقائيًا باستخدام نص برمجي بلغة Python أو أداة تحليل السجلّات، يمكن تنفيذ منطق استخراج قيمتَي عدد اللقطات في الثانية عند النسبة المئوية 90 و99 من المخطط التكراري على النحو التالي:

    # 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
    
  6. إيقاف عملية الالتقاط: بعد جمع كل المعلومات الضرورية، عليك إيقاف timestats باستخدام علامة disable:

    adb shell dumpsys SurfaceFlinger --timestats -disable
    

الجلسات البطيئة

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

على الرغم من أنّ كلًا من "الجلسة البطيئة" و"عدد اللقطات في الثانية" مستمدّان من أوقات عرض اللقطات، فإنّهما يؤديان دورَين مختلفَين. تقيس مقاييس متوسط عدد اللقطات في الثانية وعدد اللقطات في الثانية عند النسبة المئوية 90 و99 جودة الأداء واستدامته، وترصد الانخفاضات اللحظية والوتيرة غير المتّسقة التي قد يتجاهلها مقياس الجلسة البطيئة.

الخاتمة

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

مراجع إضافية

لمزيد من المعلومات عن تقنيات تحديد الملفات الشخصية المتقدّمة وتنفيذ واجهة برمجة التطبيقات Frame Pacing API واستراتيجيات التحسين الخاصة بالمحرك، يُرجى الاطّلاع على مستندات مطوّري Android الرسمية:

  • مؤشرات Android الحيوية: الجلسات البطيئة: يمكنك فهم كيفية قياس Google Play لفترات العرض البطيء المستمرة والإبلاغ عنها، ما يؤثر بشكل مباشر في تجربة المستخدم. يُعرَّف "الجلسة البطيئة" بأنّها جلسة مستخدم تكون فيها أكثر من% 25 من اللقطات بطيئة (على سبيل المثال، تستغرق أكثر من 50 ملي ثانية، ما يعادل 20 لقطة في الثانية).
  • مطوّرو Android: تحسين أداء اللعبة: يمكنك استكشاف المركز الرئيسي لتحسين ألعاب Android. يغطّي هذا الدليل الشامل أفضل الممارسات وأدوات تحديد الملفات الشخصية (مثل Android Performance Analyzer‏(APA) و Perfetto) لمساعدتك في زيادة الأداء العام للعبتك إلى أقصى حد.