गेम में इंतज़ार का समय कम होने पर, ये गेम ज़्यादा असली और रिस्पॉन्सिव लगते हैं.
नीचे दी गई चेकलिस्ट पूरी करके, इस ऐप पर गेम खेलने के दौरान इंतज़ार का समय कम करने वाले ऑडियो की सुविधा चालू करें Android:
- Obo का इस्तेमाल करें
- परफ़ॉर्मेंस मोड का अनुरोध करना, "लाइव स्ट्रीमिंग करने और उसके दिखने के बीच इंतज़ार का समय कम रखना"
- "खास तौर पर" शेयर करने वाला मोड पाने का अनुरोध करना
- 48000 हर्ट्ज़ या Oboe सैंपल रेट कन्वर्टर का इस्तेमाल करना
- इस्तेमाल को AAUDIO_USAGE_GAME पर सेट करें
- डेटा कॉलबैक का इस्तेमाल करना
- कॉलबैक में कार्रवाइयों को ब्लॉक करने से बचना
- बफ़र साइज़ को "डबल बफ़र" में बदलना
1. Oboe API का इस्तेमाल करना
Oboe API एक C++ रैपर है, जो Android 8.1 (एपीआई लेवल 27) या उसके बाद के वर्शन पर ऑडियो. Android के पुराने वर्शन में, ओबो, OpenSL ES का इस्तेमाल करता है.
Omoe, GitHub पर या इसके तौर पर उपलब्ध है पहले से बनी बाइनरी. ओबो के पास एक QuirksManager भी है, जो कुछ खास डिवाइसों की समस्याओं को ठीक करने के लिए, उन्हें ठीक करता है, इससे आपका ऐप्लिकेशन ज़्यादा डिवाइसों के साथ काम करता है. अगर आप ओबो का इस्तेमाल नहीं कर सकते, तो सीधे Aऑडियो.
2. लाइव स्ट्रीमिंग करने और उसके दिखने के बीच इंतज़ार का समय कम करने वाले मोड का अनुरोध करें
Oboe या AAudio का इस्तेमाल करके, इंतज़ार का समय कम करने वाले मोड का अनुरोध करें. ऐसा न करने पर, आपको ज़्यादा डिफ़ॉल्ट रूप से इंतज़ार का समय मोड.
ओबो
builder.setPerformanceMode(oboe::PerformanceMode::LowLatency);
ऑडियो
AAudioStreamBuilder_setPerformanceMode(builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);
3. खास मोड के लिए अनुरोध करें
आप MMAP बफ़र के लिए खास ऐक्सेस का अनुरोध भी कर सकते हैं. शायद आपका ऐप्लिकेशन न मिले खास ऐक्सेस मिलता है, लेकिन अगर अनुमति है, तो आपका ऐप्लिकेशन सीधे ऐसे बफ़र में लिखता है जो DSP की ओर से पढ़ा जाता है. इससे आपके ऐप्लिकेशन के लोड होने में लगने वाला सबसे कम समय लगता है.
ओबो
builder.setSharingMode(oboe::SharingMode::Exclusive);
ऑडियो
AAudioStreamBuilder_setSharingMode(builder, AAUDIO_SHARING_MODE_EXCLUSIVE);
4. सैंपल रेट कन्वर्ज़न से बचें
डिवाइस के सामान्य सैंपल रेट का इस्तेमाल करें. यह काम करने के लिए यह निर्देश न दें कि सैंपल रेट लिया जाता है, और करीब-करीब 48000 हर्ट्ज़ पर ही रेट किया जाता है. अगर आप कोई सैंपल तय करते हैं दर, ऑडियो फ़्रेमवर्क आपके डेटा को एक ऐसे अलग पथ पर भेजता है, जो काफ़ी ज़्यादा इंतज़ार का समय हो सकता है.
अगर आपको कोई दूसरा सैंपल रेट इस्तेमाल करना है, तो Omoe का सैंपल रेट इस्तेमाल करें रूपांतरण:
builder->setSampleRateConversionQuality(oboe::SampleRateConversionQuality::Medium);
5. अपने इस्तेमाल के उदाहरण के बारे में सही तरीके से एलान करना
आपके ऐप्लिकेशन में ऑडियो चलाने की वजह बताना, सिस्टम के लिए यह बताना ज़रूरी है
सही रूटिंग, वॉल्यूम, और प्रदर्शन सेटिंग की ज़रूरत होती है. उदाहरण के लिए, गेम को
इंतज़ार के समय का पूरा फ़ायदा लेने के लिए, इस्तेमाल AAUDIO_USAGE_GAME
के बारे में बताएं
ऑप्टिमाइज़ेशन, खासकर ब्लूटूथ हेडसेट से कनेक्ट होने पर.
ओबो
builder.setUsage(oboe::Usage::Game);
ऑडियो
AAudioStreamBuilder_setUsage(builder, AAUDIO_USAGE_GAME);
6. कॉलबैक फ़ंक्शन का इस्तेमाल करना
आउटपुट स्ट्रीम के लिए कॉलबैक का इस्तेमाल करें. अगर लिखे गए ब्लॉक करने की सुविधा का इस्तेमाल किया जा रहा है और आपने Aऑडियो MMAP मोड के साथ काम न करने वाले डिवाइस पर, इंतज़ार का समय ज़्यादा हो सकता है उच्च.
ओबो
builder.setDataCallback(&myCallbackObject);
ऑडियो
AAudioStreamBuilder_setDataCallback(builder, &my_callback_proc);
7. कॉलबैक में ब्लॉक करने से बचें
जब लाइव स्ट्रीमिंग करने और उसके दिखने के बीच इंतज़ार का समय कम रखा जाता है, तो कॉलबैक के बीच में काफ़ी समय लग सकता है बस कुछ मिलीसेकंड तक. इसलिए, यह ज़रूरी है कि आप कॉलबैक में ऐसी कोई भी चीज़ हो जो लंबे समय तक ब्लॉक हो सके. अगर कॉलबैक ब्लॉक होने के बाद, ऑडियो में बफ़र होने में परेशानी और दिक्कत होती है.
कॉलबैक में ये काम करने से बचें:
- मेमोरी असाइन करना या खाली करना
- फ़ाइल या नेटवर्क I/O
- म्यूटेक्स या लॉक का इंतज़ार किया जा रहा है
- नींद
- एक बार इस्तेमाल होने वाले सीपीयू की भारी कैलकुलेशन
कॉलबैक को बिना किसी रुकावट के आसानी से वीडियो चलाने के लिए, समान रफ़्तार से हिसाब लगाना चाहिए तकनीकी समस्या.
8. बफ़र साइज़ को कम या ज़्यादा करें
ऐप्लिकेशन के ऑडियो स्ट्रीम खोलने के बाद, आपको इस्तेमाल किया जा सकने वाला बफ़र साइज़ बदलना होगा की जांच करें. Oboe बफ़र साइज़ को अपने-आप दो बर्स्ट पर सेट करता है. लेकिन A Audio के साथ, डिफ़ॉल्ट वैल्यू काफ़ी ज़्यादा है. डबल बफ़रिंग का इस्तेमाल करें. इसके लिए बफ़र का साइज़, बर्स्ट साइज़ से दोगुना होना चाहिए. कॉलबैक का ज़्यादा से ज़्यादा साइज़, बर्स्ट साइज़ है साइज़.
ऑडियो:
int32_t frames = AAudioStream_getFramesPerBurst() * 2;
AAudioStream_setBufferSizeInFrames(stream, frames);
अगर बफ़र का साइज़ बहुत छोटा है, तो बफ़र की वजह से होने वाली समस्याएं आ सकती हैं
अंडररन. आप कॉल करके तकनीकी समस्याओं की गिनती कर सकते हैं
AAudioStream_getXRunCount(stream)
. ज़रूरत के हिसाब से बफ़र का साइज़ बढ़ाएं.
ज़्यादा जानकारी के लिए, GitHub Omoe के दस्तावेज़ देखें.
ओपनएसएल ईएस
अगर आप Android के 8.1 से पहले के वर्शन पर काम कर रहे हैं, तो आपको OpenSL ES. अगर आपके पास Omoe का इस्तेमाल है, तो अपने ऐप्लिकेशन को बेहतर बनाने के लिए उसे कॉन्फ़िगर किया जा सकता है इंतज़ार का समय. यहां जाएं: उम्मीद के हिसाब से इंतज़ार का समय पाना .
चेकलिस्ट के नतीजे
नीचे दी गई टेबल में ओबोटेस्टर दोतरफ़ा यात्रा (आउटपुट में इनपुट) इंतज़ार के समय के माप.
कॉन्फ़िगरेशन | इंतज़ार का समय (मि॰से॰) |
---|---|
सभी सुझावों को फ़ॉलो करें | 20 |
परफ़ॉर्मेंस मोड चालू होने और उसके दिखने के बीच इंतज़ार का समय कम नहीं होना | 205 |
खास नहीं है (शेयर किया गया) | 26 |
44100 हर्ट्ज़ (एऑडियो) | 160 |
44100 हर्ट्ज़ (ओबो एसआरसी) | 23 |
आउटपुट कॉलबैक (MMAP) का इस्तेमाल नहीं करना | 21 |
आउटपुट कॉलबैक का इस्तेमाल नहीं किया जा रहा है (MMAP नहीं) | 62 |
बफ़र का साइज़ 'ज़्यादा से ज़्यादा' पर सेट किया गया है | 53 |