औसत एफ़पीएस (फ़्रेम प्रति सेकंड)
Android डिवाइसों पर, बेहतरीन क्वालिटी वाला गेमिंग अनुभव देने के लिए, फ़्रेम रेट का स्थिर और तेज़ होना ज़रूरी है. गेम की परफ़ॉर्मेंस को मेज़र करते समय, आपको औसत एफ़पीएस को बेसलाइन के तौर पर मेज़र करना चाहिए. इससे, गेमिंग अनुभव के बारे में बुनियादी जानकारी मिलती है. आपको अपने गेम को 60 एफ़पीएस (फ़्रेम प्रति सेकंड) के औसत फ़्रेम रेट के हिसाब से ऑप्टिमाइज़ करना चाहिए, ताकि गेमिंग का बेहतरीन अनुभव दिया जा सके.
स्थिरता के लिए P90 और P99 एफ़पीएस
औसत 60 एफ़पीएस (फ़्रेम प्रति सेकंड) के साथ, किसी गेम में रुक-रुक कर गड़बड़ियां, माइक्रो-स्टटरिंग, और इनपुट लैग की समस्या हो सकती है. इससे, गेम खेलने वाले लोगों को खराब अनुभव मिलता है.
इसलिए, फ़्रेम की स्थिरता उतनी ही ज़रूरी है जितना कि औसत फ़्रेम रेट को ट्रैक करना. यहां आपको P90 और P99 फ़्रेम रेट मेट्रिक को, क्रमशः स्थिर बेसलाइन और स्टटर इंडिकेटर के तौर पर मेज़र करना चाहिए. ये मेट्रिक, परफ़ॉर्मेंस के "टेल एंड" को कैप्चर करती हैं, ताकि गेम खेलने वाले लोगों को मिलने वाले अनुभव को ऑप्टिमाइज़ किया जा सके.
मेट्रिक
- औसत एफ़पीएस (बेसलाइन): यह बुनियादी मेट्रिक, आपके गेम की परफ़ॉर्मेंस की सामान्य बेसलाइन देती है. यह एक स्टैंडर्ड बेंचमार्क है. हालांकि, औसत की गणना का मतलब है कि रुक-रुक कर होने वाले फ़्रेम ड्रॉप और माइक्रो-स्टटरिंग का पता नहीं लगाया जा सकता. इसलिए, यह मेट्रिक अकेले गेम खेलने वाले लोगों के अनुभव को दिखाने के लिए काफ़ी नहीं है.
- P90 एफ़पीएस (10% पर्सेंटाइल पर स्थिर बेसलाइन): इससे पता चलता है कि आपके 90% फ़्रेम, इस स्थिर बेसलाइन से ज़्यादा हैं. साथ ही, सिर्फ़ 10% सबसे धीमे फ़्रेम को रेंडर होने में ज़्यादा समय लगा. अगर आपका P90 फ़्रेम रेट ज़्यादा है और यह आपके औसत के आस-पास है, तो गेम, सेशन के ज़्यादातर हिस्से में लगातार अच्छी तरह से चल रहा है.
- P99 एफ़पीएस (1% पर्सेंटाइल पर स्टटर इंडिकेटर): इससे पता चलता है कि आपके 99% फ़्रेम, इस स्टटर इंडिकेटर से ज़्यादा हैं. साथ ही, सिर्फ़ 1% सबसे धीमे फ़्रेम को अलग किया गया है. यह मेट्रिक, माइक्रो-स्टटर, ऐसेट लोड होने में लगने वाली देरी, और ऐसेट-हैवी रेंडरिंग में अचानक होने वाली बढ़ोतरी का पता लगाने के लिए ज़रूरी है. इससे, दिखने वाली गड़बड़ियां होती हैं.
उदाहरण
औसत एफ़पीएस की तुलना P90 और P99 मेट्रिक से करके, किसी गेम के असल व्यवहार का सटीक पता लगाया जा सकता है.
पहला विकल्प: ऑप्टिमल कर्व (ऑप्टिमाइज़ किया गया गेम)
- औसत: 60 एफ़पीएस (16.6 मि॰से॰)
- P90: 58 एफ़पीएस (17.2 मि॰से॰)
- P99: 52 एफ़पीएस (19.2 मि॰से॰)
- विश्लेषण: मेट्रिक, एक-दूसरे के काफ़ी करीब हैं. गेम, बहुत आसानी से और लगातार चलता है. इसमें माइक्रो-स्टटर नहीं होते. साथ ही, सबसे खराब 1% फ़्रेम भी, आम तौर पर दिखने वाली गड़बड़ियों से अलग होते हैं.
दूसरा विकल्प: लोड बॉटलनेक (सीपीयू/जीपीयू बाउंड)
- औसत: 45 एफ़पीएस (22.2 मि॰से॰)
- P90: 40 एफ़पीएस (25.0 मि॰से॰)
- P99: 38 एफ़पीएस (26.3 मि॰से॰)
- विश्लेषण: औसत फ़्रेम रेट कम है, लेकिन यह लगातार कम है. औसत की तुलना में, P99 में ज़्यादा गिरावट नहीं होती. इससे पता चलता है कि सिस्टम, ग्राफ़िकल सेटिंग या रिज़ॉल्यूशन की पाबंदियों की वजह से ज़्यादा लोड ले रहा है. गेम में स्टटरिंग नहीं होगी, लेकिन यह धीमा चलेगा. ग्राफ़िक्स सेटिंग कम करने से, आम तौर पर इन मेट्रिक को एक जैसा बढ़ाया जा सकेगा.
तीसरा विकल्प: 60 एफ़पीएस (फ़्रेम प्रति सेकंड) की दर का स्थिर न होना (शेडर कंपाइलेशन / ऐसेट स्ट्रीमिंग स्टटर)
- औसत: 60 एफ़पीएस (16.6 मि॰से॰)
- P90: 45 एफ़पीएस (22.2 मि॰से॰)
- P99: 15 एफ़पीएस (66.6 मि॰से॰)
- विश्लेषण: यह सबसे खराब स्थिति है. औसत फ़्रेम रेट बेहतरीन दिखता है, लेकिन P99 से एक गंभीर समस्या का पता चलता है. P99 का 66.6 मि॰से॰ का मतलब है कि गेम, एक बार में कई फ़्रेम के लिए पूरी तरह से फ़्रीज़ हो रहा है. इससे गंभीर आउटलायर का पता चलता है. आम तौर पर, ऐसा सीपीयू बॉटलनेक, ऐसेट स्ट्रीमिंग में होने वाली देरी (उदाहरण के लिए, धीमी रैम या स्टोरेज), या शेडर कंपाइलेशन की वजह से होने वाली गड़बड़ियों की वजह से होता है.
आकलन
औसत एफ़पीएस, P90, और P99 को असरदार तरीके से मेज़र करने के लिए, Android
dumpsys surfaceflinger timestats कमांड का इस्तेमाल किया जा सकता है. यह टूल, रेंडर किए जा रहे सभी लेयर के लिए औसत एफ़पीएस और presentToPresent टाइमिंग हिस्टोग्राम देता है. किसी फ़्रेम का presentToPresent टाइम, मौजूदा फ़्रेम और उससे पहले वाले फ़्रेम के बीच का इंटरवल होता है.
अपने गेम के लिए इन मेट्रिक को इकट्ठा करने और इनका हिसाब लगाने के लिए, यहां दिया गया तरीका अपनाएं:
कैप्चर करना शुरू करें: जानकारी कैप्चर करने के लिए, enable और clear फ़्लैग के साथ यह कमांड चलाएं:
adb shell dumpsys SurfaceFlinger --timestats -clear -enableजानकारी डंप करें: जब गेम को काफ़ी समय तक खेला जा चुका हो, तो जानकारी आउटपुट करने के लिए, dump फ़्लैग के साथ यह कमांड फिर से चलाएं:
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=0A. कॉन्सेप्ट वाला उदाहरण (कुल डिस्ट्रिब्यूशन टेबल) मान लें कि आपके गेम सेशन में कुल 1,000 फ़्रेम रिकॉर्ड किए गए. P90 और P99 ढूंढने के लिए, आपको मिलीसेकंड थ्रेशोल्ड की गणना करनी होगी. इसमें, सबसे कम मिलीसेकंड बकेट से गिनती करते हुए, कुल फ़्रेम की संख्या क्रमशः 900 फ़्रेम (90%) और 990 फ़्रेम (99%) तक पहुंचती है.
फ़्रेम रेंडर होने में लगने वाला समय (मिलीसेकंड) फ़्रेम की संख्या (हिस्टोग्राम) कुल फ़्रेम की संख्या पर्सेंटाइल स्टेटस / गणना 16 मि॰से॰ 850 850 85.0% 33 मि॰से॰ 100 950 95.0%
(P90 का टारगेट 900 पूरा हुआ! → 1000/33 = 30.3 एफ़पीएस)50 मि॰से॰ 35 985 98.5% 66 मि॰से॰ 10 995 99.5%
(P99 का टारगेट 990 पूरा हुआ! → 1000/66 = 15.1 एफ़पीएस)102 मि॰से॰ 5 1,000 100% B. लागू करने की लॉजिक (स्यूडोकोड) अगर 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कैप्चर करना बंद करें: सभी ज़रूरी जानकारी इकट्ठा करने के बाद, आपको disable फ़्लैग का इस्तेमाल करके, timestats को बंद करना चाहिए:
adb shell dumpsys SurfaceFlinger --timestats -disable
धीमे सेशन
धीमे सेशन से, असल दुनिया में परफ़ॉर्मेंस से जुड़ी समस्याओं का पता चलता है. अगर 25% से ज़्यादा फ़्रेम, किसी थ्रेशोल्ड (उदाहरण के लिए, 20 एफ़पीएस) से कम हो जाते हैं, तो सेशन को "धीमा" माना जाता है. बिल्ड से जुड़ी गंभीर समस्याओं का पता लगाने के लिए यह मेट्रिक काम की है. हालांकि, इस मेट्रिक से, बेहतरीन क्वालिटी और लगातार मिलने वाले अनुभव की गारंटी नहीं मिलती. ऐसा हो सकता है कि कोई गेम, धीमे सेशन के थ्रेशोल्ड से बच जाए, लेकिन उसमें माइक्रो-स्टटरिंग की समस्या हो. इससे, 60 एफ़पीएस (फ़्रेम प्रति सेकंड) का बेहतरीन अनुभव नहीं मिल पाता.
'धीमे सेशन' और 'फ़्रेम रेट', दोनों मेट्रिक, फ़्रेम रेंडर होने में लगने वाले समय से मिलती हैं. हालांकि, दोनों अलग-अलग काम करती हैं. औसत, P90, और P99 एफ़पीएस मेट्रिक, परफ़ॉर्मेंस की क्वालिटी और लगातार मिलने वाले अनुभव को मेज़र करती हैं. साथ ही, ये मेट्रिक, अचानक होने वाले फ़्रेम ड्रॉप और रुक-रुक कर होने वाली गड़बड़ियों का पता लगाती हैं. धीमे सेशन की मेट्रिक में इन समस्याओं का पता नहीं चलता.
नतीजा
परफ़ॉर्मेंस को ऑप्टिमाइज़ करने के लिए, एक पूरी रणनीति की ज़रूरत होती है. डेवलपर को, परफ़ॉर्मेंस में होने वाली गंभीर गिरावट का पता लगाने के लिए, धीमे सेशन को मुख्य रडार के तौर पर इस्तेमाल करना चाहिए. इसके बाद, असल वजहों का पता लगाने और गेमप्ले की असल परफ़ॉर्मेंस की पुष्टि करने के लिए, औसत एफ़पीएस, P90, और P99 की जांच करनी चाहिए. इन मेट्रिक को इंटिग्रेट करके, यह पक्का किया जा सकता है कि आपका ऐप्लिकेशन, लगातार और बेहतरीन उपयोगकर्ता अनुभव दे.
अन्य संसाधन
प्रोफ़ाइलिंग की बेहतर तकनीकों, फ़्रेम पेसिंग एपीआई को लागू करने, और इंजन के हिसाब से ऑप्टिमाइज़ेशन की रणनीतियों के बारे में ज़्यादा जानने के लिए, Android डेवलपर के आधिकारिक दस्तावेज़ देखें:
- Android की ज़रूरी जानकारी: धीमे सेशन: जानें कि Google Play रेंडरिंग में लगने वाले समय को कैसे मेज़र करता है और इसकी रिपोर्ट कैसे देता है. इससे, उपयोगकर्ता अनुभव पर सीधे तौर पर असर पड़ता है. "धीमे सेशन" का मतलब है कि उपयोगकर्ता के सेशन में 25% से ज़्यादा फ़्रेम, धीमी रफ़्तार से रेंडर होते हैं. उदाहरण के लिए, 50 मि॰से॰ से ज़्यादा समय लगना. यह 20 एफ़पीएस (फ़्रेम प्रति सेकंड) के बराबर है.
- Android डेवलपर: गेम की परफ़ॉर्मेंस ऑप्टिमाइज़ करना: Android गेम ऑप्टिमाइज़ेशन के लिए, मुख्य हब देखें. इस पूरी गाइड में, सबसे सही तरीकों और प्रोफ़ाइलिंग टूल (जैसे, AGI और Perfetto) के बारे में बताया गया है. इससे, आपको अपने गेम की कुल परफ़ॉर्मेंस को बेहतर बनाने में मदद मिलती है.