60fps هو معدل إطارات يبلغ 60 إطاراً في الثانية، حيث يستغرق كل إطار 16.7 مللي ثانية بالضبط، مما يوفر حركة سلسة بصرياً. وفقاً لدليل تحسين أداء الألعاب في Android، يُعتبر 60 FPS ثابتاً المعيار الأدنى للرسوم المتحركة المريحة في التطبيقات المحمولة. 16.7 مللي ثانية هي الميزانية الزمنية لعرض إطار واحد يجب على المطور الالتزام بها لتحقيق 60 FPS.
الملخص
60fps (60 إطاراً في الثانية، frames per second) هو مقياس لمعدل تغيير الإطارات حيث تقوم الشاشة بتحديث الصورة 60 مرة كل ثانية. تتوقف العين البشرية عن تمييز الإطارات المنفصلة عند حوالي 50–60 هرتز بفضل تأثير استمرار الرؤية، مما يجعل 60fps حداً طبيعياً للسلاسة لمعظم المستخدمين.
كل إطار عند 60fps له ميزانية زمنية ثابتة تبلغ 16.67 مللي ثانية. تشمل هذه الميزانية كل شيء: من معالجة إدخال المستخدم إلى العرض والإخراج على الشاشة. إذا تجاوزت أي عملية — الفيزياء، الرسوم المتحركة، عرض مشهد معقد — هذا الحد، ينخفض معدل الإطارات إلى 30fps أو أقل، وهو ما يُدرك بصرياً كتقطيع.
في التطوير المحمول، كان 60fps لفترة طويلة هو الحد الأعلى بسبب قيود الأجهزة: معظم الشاشات قبل عام 2017 كانت تعمل بتردد 60 هرتز. مع ظهور شاشات 90 هرتز و 120 هرتز، أصبح 60fps المعيار الأدنى وليس الهدف الأعلى. ومع ذلك، لتطبيقات الواجهات والفيديو ومعظم الألعاب البسيطة، لا يزال 60fps هو المؤشر المستهدف للأداء.
60 هرتز هو تردد التيار المتردد في شبكات الكهرباء في الولايات المتحدة واليابان، والذي حدد تاريخياً معدل تحديث أول معايير التلفزيون NTSC. استخدم معيار PAL تردد 50 هرتز بسبب الشبكة الأوروبية 50 هرتز. انتقل هذا الجمود التاريخي إلى شاشات الكمبيوتر ومن ثم إلى الشاشات المحمولة.
تأثير الاستمرار هو خاصية للرؤية البشرية تحتفظ بالصورة على شبكية العين لمدة 30–50 مللي ثانية تقريباً بعد اختفاء المحفز. عند 60fps، يصل إطار جديد كل 16.7 مللي ثانية — قبل أن يختفي الأثر المستمر للإطار السابق، مما يخلق وهم الحركة المستمرة. تظهر دراسات جامعة كارديف (2023) أن طياري المقاتلات يمكنهم تمييز إطار منفرد عند 220 هرتز، ولكن بالنسبة للمستخدم العادي، الفرق بين 60 و 120 هرتز أقل وضوحاً بكثير من الفرق بين 30 و 60 هرتز.
وضعت Apple معيار 60fps لنظام iOS في عام 2007 مع أول iPhone وحافظت عليه حتى iPhone 13 Pro (2021). اتبع Android تاريخياً نفس المعيار، على الرغم من أن الأجهزة الأولى بتردد 90 هرتز (OnePlus 7 Pro، 2019) و 120 هرتز (Razer Phone، 2017) ظهرت في وقت سابق. اليوم، 60fps هو الحد الأدنى لاجتياز المراجعة في App Store و Google Play للتطبيقات ذات الرسوم المتحركة، على الرغم من أن المتطلبات الرسمية غير موثقة.
قياس FPS هو الخطوة الأولى للتحسين. بدون مقاييس موضوعية، من المستحيل تحديد أين يُفقد الأداء. توفر المنصات المحمولة أدوات توصيف مدمجة و APIs برمجية لقياس معدل الإطارات في الوقت الفعلي.
Android Studio Profiler و Xcode Instruments هما الأداتان الرئيسيتان لتحليل FPS. يعرض Android Profiler وقت عرض GPU ومعدل الإطارات و Jank (عدد الإطارات المفقودة). تشمل Xcode Instruments قالب Core Animation الذي يعرض معدل الإطارات ووقت العرض وعدد draw calls. لمحركات الألعاب، يوفر Unity Profiler و Unreal Insights تحليلات زمنية مفصلة حسب الوحدة.
// Android — قياس FPS عبر FrameMetrics
window.addOnFrameMetricsAvailableListener(
{ _, frameMetrics ->
val duration = frameMetrics[FrameMetrics.TOTAL_DURATION]
val fps = 1000f / (duration / 1_000_000f)
Log.d("FPS", "Frame duration: ${duration / 1_000_000} ms, FPS: $fps")
},
Handler(Looper.getMainLooper())
)
CADisplayLink في iOS و Choreographer في Android هما آليتان نظاميتان تزامنان العرض مع معدل تحديث الشاشة. يستدعي CADisplayLink طريقة مع كل إطار جديد، مرراً timestamp لحساب التأخير. يفعل Choreographer في Android الشيء نفسه ولكنه يدعم عمليات الاسترجاع لمراحل مختلفة من الإطار: الإدخال، الرسوم المتحركة، المعالجة، العرض. يمكن للمطور الاشتراك في Choreographer.FrameCallback وقياس الوقت بين الإطارات.
60fps مستقرة تعني أن أياً من الإطارات لا يتجاوز الميزانية البالغة 16.7 مللي ثانية. حتى إطار طويل واحد في الثانية يخلق تقطيعاً ملحوظاً. ينقسم التحسين إلى ثلاثة مستويات: CPU و GPU والذاكرة. يمكن لكل منها أن يصبح عنق زجاجة.
تمرير التخطيط هو أحد أكبر مستهلكي وقت CPU في Android و iOS. التسلسل الهرمي المعقد للعروض و ConstraintLayouts المتداخلة والـ drawables الثقيلة تخلق سلاسل طويلة من القياس والتخطيط. لتطبيقات الواجهات، استخدم تسلسلاً هرمياً مسطحاً للعرض (عمق لا يزيد عن 3–4 مستويات)، واستبدل RecyclerViews المتداخلة بـ ConcatAdapter، وللقوائم في iOS — استخدم compositional layout مع prefetching.
| العملية | الوقت النموذجي | التأثير عند التجاوز |
|---|---|---|
| Layout | 1–3 مللي ثانية | تقطيع في الشاشات المعقدة |
| Draw | 2–8 مللي ثانية | إعادة رسم، فقدان إطارات |
| GPU Render | 3–10 مللي ثانية | انخفاض FPS إلى النصف |
| GC (جمع القمامة) | 2–50 مللي ثانية | تقطيع دقيق ملحوظ للعين |
Overdraw هو العرض المتكرر لنفس وحدات البكسل. كل طبقة عرض وخلفية وصورة تحت عنصر شفاف تزيد من عدد عمليات البكسل. في Android، استخدم Debug GPU Overdraw في Developer Options؛ في iOS — Xcode Debug View Hierarchy. قلل overdraw بإزالة الخلفيات غير الضرورية واستخدام علامات opaque: في Android — @drawable مع android:opaque، في iOS — isOpaque = true لـ UIKit.View.
Draw calls هي عدد أوامر العرض المرسلة إلى GPU. تتعامل GPUs المحمولة الحديثة مع 200–400 draw call لكل إطار عند 60fps. تجاوز هذا العدد يسبب انخفاضاً في الأداء. ادمج sprites في أطالس نسيج، واستخدم batching، وتجنب العرض الفردي لكل عنصر عبر draw call منفصل.
تجميد GC هو أحد الأسباب الرئيسية لعدم استقرار FPS في تطبيقات JVM و Kotlin. يمكن أن يستغرق جمع القمامة في Android ما يصل إلى 30–50 مللي ثانية، مما يتسبب في فقدان 2–3 إطارات متتالية. تجنب التخصيصات في حلقات الرسوم المتحركة، واستخدم مجموعات الكائنات والتخصيص المسبق للذاكرة. في iOS، المشكلة أقل خطورة بسبب ARC، ولكن دورات الاحتفاظ وفيضانات مجمع التحرير التلقائي تخلق أيضاً تقطيعاً دقيقاً.
بالنسبة لـ الألعاب، 60fps ليس مجرد معيار بل ميزة تنافسية. تظهر دراسات Newzoo (2024) أن الألعاب ذات FPS غير المستقر تحت 60 تتلقى مراجعات سلبية أكثر بنسبة 40% على Google Play. توفر Unity و Unreal Engine أدوات توصيف مدمجة لمراقبة وقت العرض: في Unity هو Frame Debugger، في Unreal — GPU Visualizer، والتي تظهر الوقت الدقيق لكل draw call و shader. تعتبر 60fps المستقرة مهمة بشكل خاص لألعاب الأكشن، حيث يمكن أن يكلف كل إطار مفقود المستخدم اجتياز المستوى.
شاشات 90 هرتز و 120 هرتز تغير معيار الأداء المستهدف. للتطبيقات التي تعمل على أجهزة ProMotion، يمكن أن يكون الهدف هو 120 إطاراً في الثانية، وتنخفض ميزانية الإطار إلى 8.3 مللي ثانية. وهذا يتطلب كوداً أكثر كفاءة بمقدار الضعف، خاصة في draw calls وعرض GPU.
ميزة معدلات التحديث العالية ليست فقط في السلاسة: 120fps تقلل زمن الاستجابة الملحوظ بمقدار 8–10 مللي ثانية، وهو أمر بالغ الأهمية للألعاب والتطبيقات التفاعلية. ومع ذلك، فإن الفرق بين 60 و 120fps يتطلب نهجاً فردياً: لتطبيقات الواجهات (التمرير والرسوم المتحركة)، قد يكون 90fps حلاً وسطاً مثالياً بين السلاسة واستهلاك الطاقة، حيث أن عرض 120 إطاراً في الثانية يستهلك طاقة أكثر بنسبة 30–40% من 60 إطاراً.
توفر Apple API لاختيار المعدل المفضل: preferredFramesPerSecond في CADisplayLink. لم يوفر Android قبل API 30 تحكماً مباشراً في المعدل، ولكن بدءاً من Android 12، يمكن للمطور تعيين RefreshRate عبر WindowManager، لطلب 60 أو 90 أو 120 هرتز حسب نوع المحتوى.
الأسئلة الشائعة
يُدرك 30fps كـ اهتزاز أثناء التمرير والرسوم المتحركة لأن كل إطار يستمر 33.3 مللي ثانية وتتمكن العين من ملاحظة التقطع. يوفر 60fps إطاراً كل 16.7 مللي ثانية — أقل من عتبة استمرار الرؤية لمعظم المستخدمين.
استخدم مُوصِّفاً (Android Profiler، Xcode Instruments) وانظر إلى الرسم البياني لزمن الإطار. إذا كان 90%+ من الإطارات تقع ضمن 16.7 مللي ثانية بدون قمم — فإن FPS مستقر. القمم الفردية حتى 30–50 مللي ثانية تخلق تقطيعاً ملحوظاً.
نعم، ولكنه يتطلب تحسيناً قوياً: دقة عرض منخفضة، shaders بسيطة، حد أدنى من draw calls، وتجنب الشفافية والظلال المعقدة. اختبر على الأجهزة منخفضة المواصفات — ستظهر الأداء الحقيقي.
بسبب آلية VSync: إذا فشلت GPU في إكمال إطار خلال 16.7 مللي ثانية، فإنها تفوت VBlank وتبقي الإطار الحالي لمدة 16.7 مللي ثانية أخرى. بشكل فعلي، يُعرض إطار واحد لدورتي تحديث، وينخفض FPS إلى النصف تماماً.
نعم. حتى التمرير البسيط للقوائم ورسوم الانتقال المتحركة تتطلب 60fps لتجربة مريحة. يلاحظ المستخدمون التقطيع فوراً عند السحب، وهذا يقلل تقييم التطبيق بمقدار 2–3 مرات في الاختبارات الذاتية.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا