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

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

أكمِل قائمة التحقّق التالية لتفعيل وقت استجابة سريع في لعبتك نظام التشغيل Android:

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

1. استخدام واجهة برمجة تطبيقات Oboes

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

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

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 هرتز. إذا حددت عينة فإن إطار العمل الصوتي يرسل بياناتك على مسار مختلف قد وقت استجابة أعلى بكثير.

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

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. تجنُّب الحظر في معاودة الاتصال

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

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

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

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

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

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

الصوت:

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

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

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

OpenSL ES

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

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

يحتوي الجدول التالي على مختبِر Oboe قياسات وقت الاستجابة للإرسال والاستقبال (الإدخال إلى الإخراج)

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