میانگین FPS
نرخ فریم روان و پایدار برای ارائه یک تجربه بازی با کیفیت بالا در دستگاههای اندروید بسیار مهم است. هنگام اندازهگیری عملکرد بازی، باید میانگین FPS را به عنوان یک معیار پایه اندازهگیری کنید تا درک اولیهای از تجربه داشته باشید. برای اطمینان از یک تجربه بازی عالی، باید بازی خود را بهینه کنید تا به نرخ فریم متوسط 60 FPS برسد.
P90 و P99 FPS برای ثبات
با میانگین روان ۶۰ فریم بر ثانیه، یک بازی هنوز هم میتواند دچار پرشهای متناوب، پرشهای جزئی و تأخیر ورودی غیرقابل پیشبینی شود که منجر به تجربه ضعیف بازیکن میشود.
بنابراین پایداری فریم به اندازه ردیابی میانگین نرخ فریم بسیار مهم است. اینجاست که باید معیارهای نرخ فریم P90 و P99 را به ترتیب به عنوان مبنای ثابت و شاخص پرش تصویر اندازهگیری کنید. این معیارها "انتهای" عملکرد را برای شما ثبت میکنند تا روان بودن تجربه بازیکن را بهینه کنید.
معیارها
- میانگین FPS (خط پایه) : این معیار اساسی، یک مبنای کلی از عملکرد بازی شما را ارائه میدهد. اگرچه این یک معیار استاندارد است، اما محاسبه میانگین به این معنی است که افت فریمهای متناوب و پرشهای جزئی قابل تشخیص نیستند و این امر آن را برای نشان دادن تجربه بازیکن به تنهایی کافی نمیکند.
- نرخ فریم در ثانیه P90 (خط پایه ثابت در 10٪ درصد) : این نشان میدهد که 90٪ از فریمهای شما از این خط پایه ثابت فراتر رفتهاند و تنها 10٪ از فریمهای کندتر برای رندر شدن زمان بیشتری نیاز داشتهاند. اگر نرخ فریم در ثانیه P90 شما بالا و نزدیک به میانگین شما باشد، بازی در اکثر قریب به اتفاق جلسه به طور مداوم و خوب اجرا میشود.
- P99 FPS (شاخص لکنت در صدک ۱٪) : این نشان میدهد که ۹۹٪ از فریمهای شما از این شاخص لکنت فراتر رفتهاند، به طور خاص کندترین ۱٪ فریمها را جدا میکند. این معیار برای تشخیص لکنتهای جزئی، تأخیرهای بارگذاری فایلها و جهشهای ناگهانی رندرینگ با حجم زیاد فایلها که باعث ایجاد وقفههای قابل مشاهده میشوند، ضروری است.
مثالها
با مقایسه میانگین FPS خود با معیارهای P90 و P99، میتوانید رفتار اساسی یک بازی را به طور دقیق تشخیص دهید.
سناریو ۱: یک منحنی بهینه (بازی بهینهشده)
- میانگین : ۶۰ فریم بر ثانیه (۱۶.۶ میلیثانیه)
- P90 : ۵۸ فریم بر ثانیه (۱۷.۲ میلیثانیه)
- P99 : 52 فریم در ثانیه (19.2 میلیثانیه)
- تحلیل : معیارها به دقت دستهبندی شدهاند. بازی فوقالعاده روان و پایدار به نظر میرسد. هیچ پرش کوچکی وجود ندارد و حتی بدترین ۱٪ فریمها هم به سختی برای چشم انسان قابل تشخیص هستند.
سناریو ۲: گلوگاه بار (محدود به CPU/GPU)
- میانگین : ۴۵ فریم در ثانیه (۲۲.۲ میلیثانیه)
- P90 : 40 فریم در ثانیه (25.0 میلیثانیه)
- P99 : 38 فریم در ثانیه (26.3 میلیثانیه)
- تحلیل : میانگین نرخ فریم پایینتر است، اما به طور مداوم اینطور است. P99 در مقایسه با میانگین، افت شدیدی ندارد. این نشان میدهد که سیستم اساساً تحت فشار تنظیمات گرافیکی یا محدودیتهای رزولوشن قرار دارد. بازی به نظر نمیرسد که لکنت داشته باشد، بلکه کند است. کاهش تنظیمات گرافیکی معمولاً این معیارها را به طور یکنواخت افزایش میدهد.
سناریو ۳: نرخ فریم ناپایدار ۶۰ فریم بر ثانیه (قطعی در کامپایل سایهزنها / استریمینگ داراییها)
- میانگین : ۶۰ فریم بر ثانیه (۱۶.۶ میلیثانیه)
- P90 : 45 فریم در ثانیه (22.2 میلیثانیه)
- P99 : 15 فریم در ثانیه (66.6 میلیثانیه)
- تحلیل : این بدترین سناریوی ممکن است. در حالی که میانگین نرخ فریم عالی به نظر میرسد، P99 یک مشکل بحرانی را آشکار میکند. P99 با 66.6 میلیثانیه به این معنی است که بازی برای چندین فریم در یک زمان کاملاً متوقف میشود. این به موارد پرت شدید اشاره دارد - که معمولاً ناشی از گلوگاههای CPU، تأخیرهای استریمینگ دارایی (به عنوان مثال، رم یا فضای ذخیرهسازی کند) یا مشکلات ناشی از کامپایل سایهزن است.
اندازهگیری
برای اندازهگیری مؤثر میانگین FPS، P90 و P99 FPS، میتوانید از دو روش زیر استفاده کنید. روش اول، تجزیه و تحلیل ردپاهای سیستم با استفاده از Android Performance Analyzer (APA) ، یک ابزار پروفایل عملکرد، است. روش دوم، استفاده از دستور adb dumpsys SurfaceFlinger --timestats موجود است.
۱. با استفاده از روش APA اندازهگیری کنید
با استفاده از APA، میتوانید ردیابی سیستم را ثبت کرده و دادههای فریم را از طریق پرسوجوهای SQL به طور دقیق تجزیه و تحلیل کنید. برای اندازهگیری معیارهای خود، این مراحل را دنبال کنید:
ضبط ردیابی با APA : بازی خود را اجرا کنید و از APA برای ضبط ردیابی سیستم در طول بخشی که میخواهید تجزیه و تحلیل کنید استفاده کنید (به عنوان مثال، نقطهای در طول گیمپلی که مشکوک به افت فریم هستید). پس از اتصال دستگاه و تکمیل ضبط ردیابی، دادههای ردیابی در رابط APA بارگذاری میشوند.

صفحه ضبط ردیابی یا صفحه ردیابی بارگذاری شده روی تب SQL در APA کلیک کنید : پس از باز شدن صفحه تحلیل ردیابی، روی تب SQL در قسمت ناوبری بالا یا کناری رابط کاربری کلیک کنید تا محیط پردازشگر ردیابی باز شود، جایی که میتوانید مستقیماً دادهها را جستجو کنید.
کوئری SQL را در تب APA SQL قرار دهید : کوئری SQL زیر را کپی کرده و در فیلد ورودی کوئری قرار دهید. این کوئری فرآیند SurfaceFlinger را شناسایی میکند، فواصل فریم را بر اساس زمانهای بهروزرسانی واقعی صفحه نمایش محاسبه میکند و میانگین FPS، FPS 10% پایین (P90) و FPS 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% پایین FPS (low_10_fps) و 1% پایین FPS (low_1_fps) در جدولی در پنجرهی نتایج نمایش داده میشوند.
صفحهای که کوئری SQL اجرا شده و چهار معیار حاصل را در یک جدول نشان میدهد
۲. اندازهگیری با استفاده از adb (dumpsys SurfaceFlinger)
برای اندازهگیری مؤثر میانگین FPS، P90 و P99، میتوانید از دستور timestats در dumpsys اندروید استفاده کنید. این ابزار میانگین FPS و یک هیستوگرام زمانبندی 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شناسایی میانگین FPS : میانگین FPS برای هر لایه به طور خودکار محاسبه میشود و مستقیماً در خروجی dump نشان داده میشود (برای مثال، averageFPS = 30.179).
... averageFPS = 30.179 ...محاسبهی FPS مربوط به P90 و P99 : برای یافتن معیارهای P90 و P99، باید totalFrames و هیستوگرام زمانبندی
presentToPresentارائه شده در dump را تجزیه و تحلیل کنید.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الف. مثال مفهومی (جدول توزیع تجمعی) فرض کنید جلسه بازی شما تعداد فریمهای کل ۱۰۰۰ را ثبت کرده است. برای یافتن P90 و P99، آستانههای میلیثانیهای را که در آن تعداد فریمهای تجمعی به ترتیب به ۹۰۰ فریم (۹۰٪) و ۹۹۰ فریم (۹۹٪) میرسد، محاسبه میکنید و از پایینترین دسته میلیثانیه به بالا میشمارید.
زمان فریم (میلیثانیه) تعداد فریم (هیستوگرام) تعداد فریم تجمعی وضعیت درصد / محاسبه ۱۶ میلیثانیه ۸۵۰ ۸۵۰ ۸۵.۰٪ ۳۳ میلیثانیه ۱۰۰ ۹۵۰ ۹۵.۰٪
( به هدف ۹۰۰ فریم بر ثانیه در P90 رسیدیم! → ۱۰۰۰ تقسیم بر ۳۳ = ۳۰.۳ فریم بر ثانیه )۵۰ میلیثانیه ۳۵ ۹۸۵ ۹۸.۵٪ ۶۶ میلیثانیه ۱۰ ۹۹۵ ۹۹.۵٪
( به هدف ۹۹۰ در P99 رسیدیم! → ۱۰۰۰/۶۶ = ۱۵.۱ فریم بر ثانیه )۱۰۲ میلیثانیه ۵ ۱۰۰۰ ۱۰۰٪ ب. منطق پیادهسازی (شبه کد) اگر این تحلیل را با استفاده از یک اسکریپت پایتون یا تجزیهکننده لاگ خودکار میکنید، منطق استخراج مقادیر 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توقف ضبط : پس از جمعآوری تمام اطلاعات لازم، باید با استفاده از پرچم غیرفعال کردن، آمار زمانی را غیرفعال کنید:
adb shell dumpsys SurfaceFlinger --timestats -disable
جلسات آهسته
جلسات آهسته (Slow Sessions) مشکلات عملکردی گسترده در دنیای واقعی را شناسایی میکنند. اگر بیش از ۲۵٪ فریمها از یک آستانه (مثلاً ۲۰ فریم در ثانیه) پایینتر بیایند، یک جلسه "کند" است. اگرچه این معیار برای تشخیص مشکلات ساخت بحرانی مفید است، اما به تنهایی نمیتواند یک تجربه با کیفیت بالا و پایدار را تضمین کند. یک بازی ممکن است از آستانه جلسه آهسته (Slow Session) اجتناب کند، اما همچنان از لکنتهای ریز رنج میبرد که یک تجربه روان ۶۰ فریم در ثانیه را به خطر میاندازد.
اگرچه هر دو از زمان فریمها مشتق شدهاند، «جلسه آهسته» و «نرخ فریم» نقشهای متفاوتی ایفا میکنند. معیارهای میانگین، P90 و P99 فریم بر ثانیه، کیفیت و پایداری عملکرد را اندازهگیری میکنند و افتهای آنی و سرعت ناپایدار را که معیار جلسه آهسته ممکن است از آنها غافل شود، تشخیص میدهند.
نتیجهگیری
بهینهسازی عملکرد موفق نیازمند یک استراتژی جامع است. توسعهدهندگان باید از Slow Sessions به عنوان یک رادار اصلی برای تشخیص افت شدید عملکرد استفاده کنند و سپس میانگین FPS، P90 و P99 را برای تشخیص علل اصلی و تأیید روان بودن واقعی گیمپلی بررسی کنند. با ادغام این معیارها، میتوانید اطمینان حاصل کنید که برنامه شما یک تجربه کاربری پایدار و استثنایی ارائه میدهد.
منابع اضافی
برای کسب اطلاعات بیشتر در مورد تکنیکهای پیشرفته پروفایلینگ، پیادهسازی API Frame Pacing و استراتژیهای بهینهسازی مختص موتور، به مستندات رسمی توسعهدهندگان اندروید مراجعه کنید:
- نکات مهم اندروید: جلسات کند : درک کنید که چگونه گوگل پلی دورههای پایدار رندر کند را اندازهگیری و گزارش میکند، که مستقیماً بر تجربه کاربر تأثیر میگذارد. "جلسه کند" به عنوان جلسه کاربری تعریف میشود که بیش از 25٪ فریمها کند باشند (به عنوان مثال، بیش از 50 میلیثانیه، معادل 20 FPS).
- توسعهدهندگان اندروید: بهینهسازی عملکرد بازی : مرکز اصلی بهینهسازی بازیهای اندروید را کاوش کنید. این راهنمای جامع، بهترین شیوهها و ابزارهای پروفایلینگ (مانند APA و Perfetto ) را پوشش میدهد تا به شما در به حداکثر رساندن عملکرد کلی بازیتان کمک کند.