Android Performance Tuner की खास जानकारी (नेटिव)

इस विषय में, Android Performance Tuner को इंटिग्रेट करने का तरीका बताया गया है. इसे Tuning Fork लाइब्रेरी के नाम से भी जाना जाता है. इसकी मदद से, नेटिव (C और C++) गेम इंजन से फ़्रेम टाइम का डेटा रिकॉर्ड और अपलोड किया जा सकता है.

Unity गेम इंजन के लिए, Unity के लिए गाइड देखें.

बैकग्राउंड

रेंडरिंग परफ़ॉर्मेंस, गेम के उपयोगकर्ता अनुभव का एक अहम हिस्सा है. रेंडरिंग की परफ़ॉर्मेंस इन दो इनपुट पर निर्भर करती है:

  • फ़्रेम रेट: फ़्रेम कितनी बार बनाया जाता है.
  • ग्राफ़िकल क्वालिटी सेटिंग: फ़िडेलिटी का वह लेवल जिस पर कोई फ़्रेम दिखाया जाता है. इसमें सिमुलेशन फ़िडेलिटी के साथ-साथ ग्राफ़िक्स भी शामिल हैं.

गेम के लिए, रेंडरिंग की अच्छी परफ़ॉर्मेंस का मतलब यह है:

  • स्टेबल और एक जैसा फ़्रेम रेट डिलीवर करना. इसका मतलब है कि फ़्रेम, तय की गई फ़्रीक्वेंसी पर रेंडर हो रहे हैं.
  • गेम को स्थिर रखते हुए, ज़्यादा से ज़्यादा फ़्रीक्वेंसी पर फ़्रेम रेंडर करना. आम तौर पर, यह गेम के टाइप के हिसाब से 30 या 60 एफ़पीएस होता है.
  • स्क्रीन के साइज़ और डेनसिटी के हिसाब से, उपयोगकर्ता को ज़्यादा से ज़्यादा जानकारी देना. साथ ही, फ़्रेम रेंडर होने की दर को स्थिर रखना.

Android फ़्रेम पेसिंग लाइब्रेरी, फ़्रेम रेंडर होने में लगने वाले समय में होने वाले बदलाव को काफ़ी हद तक कम कर देती है. इससे गेम के लिए, फ़्रेम रेट स्थिर रहता है. फ़्रेम रेंडर होने में लगने वाले समय में बाकी अंतर, गेमप्ले के दौरान कुछ सीन में दिखाई गई बारीकियों और डिवाइस की ग्राफ़िकल क्षमताओं की वजह से होता है. Android Performance Tuner का इस्तेमाल करके, गेमप्ले के दौरान उन समयों का पता लगाया जा सकता है जब फ़्रेम टाइम, टारगेट फ़्रेम टाइम से कम या ज़्यादा होता है. साथ ही, इन समस्याओं और अवसरों को इनसे जोड़ा जा सकता है:

  • क्वालिटी की खास सेटिंग
  • आपके गेम के खास सीन
  • डिवाइस के मॉडल या डिवाइस की खास जानकारी

डेटा रिकॉर्ड और अपलोड करना

Tuning Fork लाइब्रेरी, अपने टिक फ़ंक्शन में से किसी एक पर निर्भर करती है. इसे Android Frame Pacing लाइब्रेरी, हर फ़्रेम के लिए कॉल करती है. लाइब्रेरी में, इस टिक की जानकारी को हिस्टोग्राम में इकट्ठा किया जाता है. इसके बाद, इन्हें समय-समय पर एचटीटीपी एंडपॉइंट के ज़रिए Google Play पर अपलोड किया जाता है. हर टिक को इंस्ट्रूमेंट की और एनोटेशन से जुड़ा हुआ रिकॉर्ड किया जाता है. इनकी परिभाषाएं, प्रोटोकॉल बफ़र फ़ाइल में तय की जाती हैं.

इंस्ट्रुमेंट की

इंस्ट्रूमेंट की से पता चलता है कि फ़्रेम में टिक कहां से आता है. यह एक पूर्णांक होता है, जिसे हर टिक फ़ंक्शन कॉल में पास करना ज़रूरी होता है. Android Frame Pacing लाइब्रेरी, इंस्ट्रूमेंट की पहले से तय की गई कुंजियों के सेट का इस्तेमाल करती है. ये कुंजियां swappy_common.h में तय की गई हैं. अगर फ़्रेम पेसिंग लाइब्रेरी का इस्तेमाल नहीं किया जाता है, तो अपने इंस्ट्रुमेंट की कुंजियां भी तय की जा सकती हैं.

एनोटेशन

एनोटेशन से, इस बारे में ज़रूरी जानकारी मिलती है कि टिक रिकॉर्ड होने के दौरान, आपके गेम में क्या चल रहा है. उदाहरण के लिए, एनोटेशन इनमें से किसी भी चीज़ की पहचान कर सकता है:

  • गेम का मौजूदा लेवल
  • स्क्रीन पर "बिग बॉस" दिख रहा है
  • गेम की स्थिति के बारे में कोई अन्य काम की जानकारी

एनोटेशन, com.google.tuningfork.Annotation प्रोटोकॉल बफ़र मैसेज से तय किए जाते हैं. मौजूदा एनोटेशन सेट करने के लिए, TuningFork_setCurrentAnnotation() को उस मैसेज का सीरियल वर्शन पास करें जिसे आपने तय किया है. इसके बाद, जब तक कोई दूसरा एनोटेशन सेट नहीं किया जाता, तब तक सभी बाद के टिक डेटा को इस एनोटेशन से जोड़ा जाता है. एनोटेशन के लिए, यहां प्रोटो की परिभाषा का एक उदाहरण दिया गया है:

import "tuningfork.proto"
enum Level {
  INVALID_LEVEL = 0;
  Level_1 = 1;
  Level_2 = 2;
  Level_3 = 3;
}
message Annotation {
  optional Level level = 1;
}

फ़िडेलिटी के पैरामीटर

फ़िडेलिटी पैरामीटर, आपके गेम की परफ़ॉर्मेंस और ग्राफ़िक की क्वालिटी से जुड़ी चीज़ों पर असर डालते हैं. जैसे, जानकारी के लेवल का पता लगाना, गेम का रिज़ॉल्यूशन, और समस्याओं को ठीक करने का तरीका. एनोटेशन की तरह, फ़िडेलिटी पैरामीटर को com.google.tuningfork.FidelityParams प्रोटोकॉल बफ़र मैसेज का इस्तेमाल करके तय किया जाता है. फ़िडेलिटी पैरामीटर के लिए, यहां प्रोटो परिभाषा का एक उदाहरण दिया गया है:

import "tuningfork.proto"
message FidelityParams {
  int32 texture_quality_level = 1;
  int32 shadow_resolution = 2;
  float terrain_details_percent = 3;
  int32 post_processing_effects_level = 4;
}

ट्यूनिंग फ़ोर्क को शुरू करते समय, आपको उन पैरामीटर का सीरियलाइज़ेशन पास करना होता है जिनका इस्तेमाल गेम करता है. अगर उपयोगकर्ता, गेम रेंडरिंग की सेटिंग में बदलाव करता है और इसके बाद अपलोड किया गया आपका डेटा, नए पैरामीटर से जुड़ा है, तो इन पैरामीटर को बदला जा सकता है.

Google Play को आपके तय किए गए एनोटेशन और फ़िडेलिटी पैरामीटर समझने के लिए, इन परिभाषाओं को सेव करने वाली प्रोटोकॉल बफ़र फ़ाइल को गेम के APK में बंडल करना होगा. साथ ही, इसमें शुरुआती सेटिंग भी शामिल होनी चाहिए. Google Play के यूज़र इंटरफ़ेस (यूआई) में अपने डेटा को इन पैरामीटर के हिसाब से सेगमेंट करने के लिए, आपको अपने APK में फ़िडेलिटी पैरामीटर के सामान्य कॉम्बिनेशन के लिए डिफ़ॉल्ट वैल्यू भी देनी होंगी. ज़्यादा जानकारी के लिए, क्वालिटी लेवल तय करना लेख पढ़ें.

मेमोरी और सीपीयू का ओवरहेड

ट्यूनिंग फ़ोर्क लाइब्रेरी के लिए इस्तेमाल की गई पूरी मेमोरी, गेमप्ले के दौरान किसी भी तरह की समस्या से बचने के लिए, शुरू में ही असाइन कर दी जाती है. डेटा का साइज़, इंस्ट्रूमेंट की कुंजियों की संख्या, एनोटेशन की संभावित संख्या, और हर हिस्टोग्राम में बकेट की संख्या पर निर्भर करता है. यह इन सभी को चार बाइट से गुणा करने पर मिलने वाली संख्या के बराबर होता है. डबल-बफ़र किए गए तरीके से सबमिट करने के लिए, सभी हिस्टोग्राम की दो कॉपी भी होती हैं.

सबमिट करने की प्रोसेस अलग थ्रेड पर होती है और यह टिक कॉल को ब्लॉक नहीं करती. अगर अपलोड करने के लिए कोई कनेक्शन उपलब्ध नहीं है, तो सबमिट किए गए डेटा को बाद में अपलोड करने के लिए लाइन में लगा दिया जाता है.

टिक फ़ंक्शन को कॉल करने में बहुत कम प्रोसेसिंग ओवरहेड होता है: यह सिर्फ़ हिस्टोग्राम बकेट के ऐरे में इंडेक्स की गिनती करता है और पूर्णांक की गिनती को बढ़ाता है.

Tuning Fork लाइब्रेरी को इंटिग्रेट करना

इस इंटिग्रेशन गाइड को दो हिस्सों में बांटा गया है. पहले हिस्से में, डेमो ऐप्लिकेशन और Google Play Console का इस्तेमाल करके, एंड-टू-एंड टेस्ट चलाने का तरीका बताया गया है. दूसरे हिस्से में, ट्यूनिंग फ़ोर्क लाइब्रेरी को अपनी टूलचेन में इंटिग्रेट करने का तरीका बताया गया है. साथ ही, लाइब्रेरी में मौजूद फ़ंक्शन इस्तेमाल करने का तरीका भी बताया गया है. शुरू करने के लिए, यहां दिए गए आगे बढ़ें लिंक पर क्लिक करें.