صوت قصير الاستجابة

يجعل الصوت بوقت الاستجابة البطيء الألعاب أكثر واقعية واستجابةً.

يُرجى إكمال قائمة التحقّق التالية لتفعيل ميزة تشغيل الصوت بسرعة استجابة سريعة في لعبتك على نظام التشغيل Android:

  1. استخدام الأوبوا
  2. طلب وضع الأداء "وقت استجابة بطيء"
  3. طلب وضع المشاركة "حصري"
  4. استخدام 48000 هرتز أو محوّل معدّل عيّنة الأوبوا
  5. ضبط الاستخدام على AAUDIO_USAGE_GAME
  6. استخدام عمليات معاودة الاتصال بالبيانات
  7. تجنُّب عمليات الحظر في معاودة الاتصال
  8. ضبط حجم المخزن المؤقت على "مخزن احتياطي مزدوج"

1. استخدام Oboe API

واجهة برمجة التطبيقات Oboe هي برنامج تضمين C++ يستدعي AAudio على Android 8.1 (المستوى 27 من واجهة برمجة التطبيقات) أو الإصدارات الأحدث. في إصدارات Android السابقة، يستخدم Oboe OpenSL ES.

يتوفر Oboe على GitHub أو كبرنامج ثنائي مسبق الإنشاء. لدى Oboe أيضًا أداة QuirksManager التي تصحح المشاكل في أجهزة معينة، ما يجعل تطبيقك متوافقًا مع المزيد من الأجهزة. إذا لم تتمكن من استخدام Oboe، استخدِم AAudio مباشرةً.

2. طلب وضع الاستجابة السريعة

باستخدام Oboe أو AAudio، يمكنك طلب وضع وقت الاستجابة المنخفض. وإلا، ستحصل على وضع وقت استجابة أعلى افتراضيًا.

أوبوا

builder.setPerformanceMode(oboe::PerformanceMode::LowLatency);

صوت A Audio

AAudioStreamBuilder_setPerformanceMode(builder, AAUDIO_PERFORMANCE_MODE_LOW_LATENCY);

3. طلب الوضع الحصري

يمكنك أيضًا طلب وصول حصري إلى المورد الاحتياطي MMAP. قد لا يحصل تطبيقك على إمكانية وصول حصرية، ولكن في حال حصوله على إذن الوصول، سينتقل تطبيقك مباشرةً إلى المخزن المؤقت الذي يقرأه نظام وسيط عرض الطلب (DSP)، ما يمنح تطبيقك أقل وقت استجابة ممكن.

أوبوا

builder.setSharingMode(oboe::SharingMode::Exclusive);

صوت A Audio

AAudioStreamBuilder_setSharingMode(builder, AAUDIO_SHARING_MODE_EXCLUSIVE);

4. تجنُّب تحويل معدّل البيانات إلى عينات

استخدام معدل العينة الطبيعي للجهاز. يمكنك فعل ذلك من خلال عدم تحديد معدّل بيانات في الملف الصوتي، وستحصل بالتأكيد على 48,000 هرتز. وإذا حدّدت معدّل بيانات في الملف الصوتي، يرسل إطار عمل الصوت بياناتك إلى مسار مختلف يمكن أن يكون له وقت استجابة أعلى بكثير.

إذا كنت بحاجة إلى استخدام معدل عينة مختلف، استخدم Oboe لإجراء تحويل معدل العينة:

builder->setSampleRateConversionQuality(oboe::SampleRateConversionQuality::Medium);

5. الإعلان بشكل صحيح عن حالة الاستخدام

من المهم تحديد سبب تشغيل الصوت في تطبيقك حتى يطبّق النظام إعدادات التوجيه ومستوى الصوت والأداء الصحيحة. على سبيل المثال، يجب أن تشير الألعاب إلى استخدام AAUDIO_USAGE_GAME للاستفادة الكاملة من تحسينات وقت الاستجابة، وخاصةً عند توصيلها بسماعات رأس بلوتوث.

أوبوا

builder.setUsage(oboe::Usage::Game);

صوت A Audio

AAudioStreamBuilder_setUsage(builder, AAUDIO_USAGE_GAME);

‫6. استخدام دالة رد اتصال

استخدام معاودة الاتصال لمصدر البيانات الناتج إذا كنت تستخدم حظر الكتابة وكنت تستخدم جهازًا لا يتوافق مع وضع AAudio MMAP، قد يكون وقت الاستجابة أعلى بكثير.

أوبوا

builder.setDataCallback(&myCallbackObject);

صوت A Audio

AAudioStreamBuilder_setDataCallback(builder, &my_callback_proc);

7. تجنُّب الحظر في معاودة الاتصال

عند استخدام بث مباشر بوقت استجابة سريع، يمكن أن يكون الوقت الفاصل بين عمليات معاودة الاتصال قصيرًا جدًا، أي بضعة مللي ثانية فقط. لذلك من المهم جدًا ألا تفعل أي شيء في معاودة الاتصال قد يحظره لفترة طويلة. إذا تم حظر معاودة الاتصال، يحدث تدفق من المخزن المؤقت ومواطن خلل في الصوت.

تجنَّب تنفيذ ما يلي في عملية معاودة الاتصال:

  • تخصيص ذاكرة أو إخلاء جزء منها
  • إدخال/إخراج الملف أو الشبكة
  • في انتظار دالة الاستبعاد المتبادل أو القفل
  • النوم
  • عمليات حسابية مكثفة لوحدة المعالجة المركزية (CPU) لمرة واحدة

يجب أن تقوم استدعاءات العملاء بإجراء عمليات حسابية بوتيرة متساوية لتشغيل التشغيل السلس بدون أعطال.

8. ضبط حجم المخزن المؤقت

بعد فتح التطبيق للبث الصوتي، يجب ضبط حجم المخزن المؤقت القابل للاستخدام للوصول إلى وقت الاستجابة الأمثل. يضبط الأوبوا تلقائيًا حجم المخزن المؤقت على مجموعتَي صور متسلسلة. ولكن مع AAudio، يكون الإعداد الافتراضي أعلى بكثير. استخدم التخزين المؤقت المزدوج عن طريق تعيين حجم المخزن المؤقت على ضعف حجم الصور المتسلسلة. حجم الصور المتسلسلة هو الحد الأقصى لحجم معاودة الاتصال.

الصوت:

int32_t frames = AAudioStream_getFramesPerBurst() * 2;
AAudioStream_setBufferSizeInFrames(stream, frames);

وإذا كان حجم المخزن المؤقت صغيرًا جدًا، فقد تحصل على أعطال ناجمة عن نقص المخزن المؤقت. يمكنك معرفة مواطن الخلل من خلال الاتصال على AAudioStream_getXRunCount(stream). يمكنك زيادة حجم المخزن المؤقت حسب الحاجة.

يمكنك الاطّلاع على مستندات GitHub Oboe للحصول على شرح للمصطلحات المرتبطة بالمورد الاحتياطي.

OpenSL ES

إذا كان جهازك متوافقًا مع إصدارات Android الأقدم من الإصدار 8.1، عليك استخدام OpenSL ES. إذا كنت تستخدم Oboe، يمكنك ضبط التطبيق لتحسين وقت الاستجابة. يمكنك الاطّلاع على تحقيق وقت الاستجابة الأمثل في مستندات GitHub.

نتائج قائمة التحقّق

يحتوي الجدول التالي على قياسات OboeTester لوقت استجابة الذهاب والعودة (إدخال إلى الإخراج).

الإعدادات وقت الاستجابة (بالمللي ثانية)
اتّباع كل الاقتراحات 20
وضع الأداء ليس بوقت استجابة سريع 205
غير حصري (مشتركة) 26
44100 هرتز (Aصوتي) 160
44100 هرتز (Oboe SRC) 23
عدم استخدام دالة رد اتصال إخراج (MMAP) 21
عدم استخدام استدعاء ناتج (وليس MMAP) 62
تم ضبط حجم المخزن المؤقت على الحد الأقصى 53