কম লেটেন্সি অডিও গেমগুলিকে আরও বাস্তবসম্মত এবং প্রতিক্রিয়াশীল বোধ করে।
অ্যান্ড্রয়েডে আপনার গেমে কম লেটেন্সি অডিও সক্ষম করতে নিম্নলিখিত চেকলিস্টটি সম্পূর্ণ করুন:
- Oboe ব্যবহার করুন
- কর্মক্ষমতা মোড "কম লেটেন্সি" অনুরোধ করুন
- শেয়ারিং মোড অনুরোধ করুন "এক্সক্লুসিভ"
- 48000 Hz বা Oboe নমুনা হার রূপান্তরকারী ব্যবহার করুন
- AAUDIO_USAGE_GAME ব্যবহার সেট করুন
- ডেটা কলব্যাক ব্যবহার করুন
- কলব্যাকে ব্লকিং অপারেশন এড়িয়ে চলুন
- টিউন বাফার সাইজ "ডাবল বাফার" এ
1. Oboe API ব্যবহার করুন
Oboe API হল একটি C++ র্যাপার যা Android 8.1 (API লেভেল 27) বা উচ্চতর সংস্করণে AAudio কল করে। আগের অ্যান্ড্রয়েড সংস্করণে, Oboe OpenSL ES ব্যবহার করে।
Oboe GitHub- এ বা একটি পূর্বনির্মাণ বাইনারি হিসাবে উপলব্ধ। Oboe-এর একটি QuirksManagerও রয়েছে যা নির্দিষ্ট ডিভাইসে সমস্যার সমাধান করে, যা আপনার অ্যাপটিকে আরও ডিভাইসের সাথে সামঞ্জস্যপূর্ণ করে তোলে। আপনি যদি Oboe ব্যবহার করতে না পারেন, তাহলে সরাসরি AAudio ব্যবহার করুন।
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 Hz পাবেন। আপনি যদি একটি নমুনা হার নির্দিষ্ট করেন, তাহলে অডিও ফ্রেমওয়ার্ক আপনার ডেটাকে একটি ভিন্ন পথে পাঠায় যাতে অনেক বেশি লেটেন্সি থাকতে পারে।
আপনি যদি একটি ভিন্ন নমুনা হার ব্যবহার করতে চান, তাহলে নমুনা হার রূপান্তর করতে Oboe ব্যবহার করুন:
builder->setSampleRateConversionQuality(oboe::SampleRateConversionQuality::Medium);
5. আপনার ব্যবহারের ক্ষেত্রে সঠিকভাবে ঘোষণা করুন
সঠিক রাউটিং, ভলিউম এবং পারফরম্যান্স সেটিংস প্রয়োগ করার জন্য আপনার অ্যাপের অডিও চালানোর কারণ উল্লেখ করা সিস্টেমের জন্য গুরুত্বপূর্ণ। উদাহরণস্বরূপ, লেটেন্সি অপ্টিমাইজেশানের সম্পূর্ণ সুবিধা নিতে গেমগুলি AAUDIO_USAGE_GAME
ব্যবহার নির্দেশ করবে, বিশেষ করে যখন ব্লুটুথ হেডসেটের সাথে সংযুক্ত থাকে৷
ওবো
builder.setUsage(oboe::Usage::Game);
অডিও
AAudioStreamBuilder_setUsage(builder, AAUDIO_USAGE_GAME);
6. একটি কলব্যাক ফাংশন ব্যবহার করুন
আউটপুট স্ট্রীমের জন্য একটি কলব্যাক ব্যবহার করুন। আপনি যদি ব্লকিং রাইট ব্যবহার করেন এবং আপনি এমন একটি ডিভাইসে থাকেন যা AAudio MMAP মোড সমর্থন করে না, তাহলে লেটেন্সি অনেক বেশি হতে পারে।
ওবো
builder.setDataCallback(&myCallbackObject);
অডিও
AAudioStreamBuilder_setDataCallback(builder, &my_callback_proc);
7. কলব্যাকে ব্লক করা এড়িয়ে চলুন
আপনি যখন কম লেটেন্সি স্ট্রিম ব্যবহার করেন, তখন কলব্যাকের মধ্যে সময় খুব কম হতে পারে, মাত্র কয়েক মিলিসেকেন্ড। তাই এটি খুবই গুরুত্বপূর্ণ যে আপনি কলব্যাকে এমন কিছু করবেন না যা দীর্ঘ সময়ের জন্য ব্লক হতে পারে। যদি কলব্যাক ব্লক করা হয়, তাহলে অডিওতে বাফার আন্ডারফ্লো এবং গ্লিচ দেখা যায়।
একটি কলব্যাকে নিম্নলিখিতগুলি করা এড়িয়ে চলুন:
- মেমরি বরাদ্দ বা মুক্ত করা
- ফাইল বা নেটওয়ার্ক I/O
- একটি মিউটেক্স বা লকের উপর অপেক্ষা করা হচ্ছে
- ঘুম
- ভারী এক-সময়ের CPU গণনা
সমস্যা ছাড়াই মসৃণ প্লেব্যাকের জন্য কলব্যাকগুলিকে সমান গতিতে গণিত করা উচিত।
8. বাফার আকার টিউন
একবার আপনার অ্যাপটি অডিও স্ট্রিম খোলে, আপনাকে সর্বোত্তম বিলম্বের জন্য ব্যবহারযোগ্য বাফার আকার টিউন করতে হবে। Oboe স্বয়ংক্রিয়ভাবে বাফারের আকার দুটি বিস্ফোরণে সেট করে। কিন্তু AAudio এর সাথে ডিফল্ট অনেক বেশি। বাফারের আকার দ্বিগুণ বিস্ফোরিত আকারে সেট করে ডাবল বাফারিং ব্যবহার করুন। বার্স্ট সাইজ হল সর্বোচ্চ কলব্যাক সাইজ।
অডিও:
int32_t frames = AAudioStream_getFramesPerBurst() * 2;
AAudioStream_setBufferSizeInFrames(stream, frames);
বাফারের আকার খুব ছোট হলে, আপনি বাফার আন্ডাররানের কারণে সমস্যা পেতে পারেন। আপনি AAudioStream_getXRunCount(stream)
এ কল করে সমস্যাগুলির একটি গণনা পেতে পারেন৷ প্রয়োজন অনুসারে বাফারের আকার বাড়ান।
বাফার-সম্পর্কিত পরিভাষার ব্যাখ্যার জন্য GitHub Oboe ডক্স দেখুন।
OpenSL ES
আপনি যদি 8.1 এর আগে Android এর সংস্করণ সমর্থন করেন তবে আপনাকে OpenSL ES ব্যবহার করতে হবে। আপনি যদি Oboe ব্যবহার করেন, তাহলে আপনি লেটেন্সি উন্নত করতে আপনার অ্যাপ কনফিগার করতে পারেন। GitHub ডক্সে সর্বোত্তম বিলম্বিতা প্রাপ্ত করা দেখুন।
চেকলিস্ট ফলাফল
নিম্নলিখিত টেবিলে রাউন্ড-ট্রিপ (ইনপুট থেকে আউটপুট) লেটেন্সির OboeTester পরিমাপ রয়েছে।
কনফিগারেশন | লেটেন্সি (মিসে) |
---|---|
সমস্ত সুপারিশ অনুসরণ করুন | 20 |
কর্মক্ষমতা মোড কম লেটেন্সি নয় | 205 |
এক্সক্লুসিভ নয় (ভাগ করা) | 26 |
44100 Hz (AAudio) | 160 |
44100 Hz (Oboe SRC) | 23 |
একটি আউটপুট কলব্যাক (MMAP) ব্যবহার করছেন না | 21 |
একটি আউটপুট কলব্যাক ব্যবহার না করা (MMAP নয়) | 62 |
বাফার আকার সর্বোচ্চ সেট | 53 |