เสียงที่มีเวลาในการตอบสนองต่ำ

เสียงที่ใช้เวลาในการตอบสนองต่ำจะทำให้เกมดูสมจริงและตอบสนองมากขึ้น

ทำตามรายการตรวจสอบต่อไปนี้ให้เสร็จสมบูรณ์เพื่อเปิดเสียงเกมที่มีเวลาในการตอบสนองต่ำในเกมบน Android

  1. ใช้โอโบ
  2. ส่งคำขอโหมดประสิทธิภาพ "เวลาในการตอบสนองต่ำ"
  3. ส่งคำขอโหมดแชร์ "เฉพาะตัว"
  4. ใช้ 48000 Hz หรือตัวแปลงอัตราการสุ่มตัวอย่างโอโบ
  5. ตั้งค่าการใช้งานเป็น AAUDIO_USAGE_GAME
  6. ใช้ Callback สำหรับข้อมูล
  7. หลีกเลี่ยงการบล็อกการดำเนินการใน Callback
  8. ปรับขนาดบัฟเฟอร์เป็น "บัฟเฟอร์ 2"

1. ใช้ Oboe API

Oboe API คือ Wrapper C++ ที่เรียกใช้ AAudio ใน Android 8.1 (API ระดับ 27) ขึ้นไป ใน Android เวอร์ชันก่อนหน้า โอโบใช้ OpenSL ES

Oboe มีให้บริการบน GitHub หรือตาม ไบนารีที่สร้างไว้ล่วงหน้า โอโบยังมี QuirksManager ที่ช่วยแก้ปัญหาในอุปกรณ์ต่างๆ ซึ่งทำให้แอปเข้ากันได้กับอุปกรณ์มากขึ้น หากคุณไม่สามารถใช้โอโบ ให้ใช้ 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 หากคุณระบุตัวอย่าง เฟรมเวิร์กเสียงจะส่งข้อมูลไปในทิศทางอื่น เวลาในการตอบสนองสูงขึ้นมาก

หากต้องการใช้อัตราการสุ่มตัวอย่างอื่น ให้ใช้โอโบเพื่อทำอัตราการสุ่มตัวอย่าง Conversion:

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

5. ประกาศ Use Case ของคุณอย่างเหมาะสม

การระบุเหตุผลที่แอปเล่นเสียงเป็นสิ่งสําคัญอย่างยิ่งสําหรับระบบ การตั้งค่าการกำหนดเส้นทาง ระดับเสียง และประสิทธิภาพที่เหมาะสม ตัวอย่างเช่น เกมควร ระบุการใช้งาน AAUDIO_USAGE_GAME เพื่อใช้ประโยชน์จากเวลาในการตอบสนองอย่างเต็มที่ การเพิ่มประสิทธิภาพ โดยเฉพาะเมื่อเชื่อมต่อกับชุดหูฟังบลูทูธ

โอโบ

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

เสียง

AAudioStreamBuilder_setUsage(builder, AAUDIO_USAGE_GAME);

6. ใช้ฟังก์ชัน Callback

ใช้ Callback สำหรับสตรีมเอาต์พุต หากใช้การบล็อกการเขียนและคุณใช้ อุปกรณ์ที่ไม่รองรับโหมด AAudio MMAP เวลาในการตอบสนองอาจมีมาก สูงขึ้น

โอโบ

builder.setDataCallback(&myCallbackObject);

เสียง

AAudioStreamBuilder_setDataCallback(builder, &my_callback_proc);

7. หลีกเลี่ยงการบล็อกใน Callback

เมื่อคุณใช้สตรีมที่มีเวลาในการตอบสนองต่ำ ระยะเวลาระหว่าง Callback อาจเป็นไปได้อย่างมาก ซึ่งก็คือไม่กี่มิลลิวินาที จึงเป็นสิ่งสำคัญมากที่คุณไม่ควรทำ อะไรก็ตามใน Callback ที่อาจบล็อกเป็นเวลานาน หาก Callback คือ ทำให้มีบัฟเฟอร์ล้นและมีข้อบกพร่องในเสียง

หลีกเลี่ยงการทำสิ่งต่อไปนี้ขณะโทรกลับ

  • การจัดสรรหรือเพิ่มพื้นที่ว่างในหน่วยความจำ
  • I/O ของไฟล์หรือเครือข่าย
  • กำลังรอปิดเสียงหรือล็อก
  • การนอนหลับ
  • การคํานวณ CPU แบบครั้งเดียวอย่างหนัก

Callback ควรทำคณิตศาสตร์ในจังหวะที่สม่ำเสมอเพื่อให้เล่นได้อย่างราบรื่นโดยไม่ต้อง ข้อบกพร่อง

8. ปรับขนาดบัฟเฟอร์

เมื่อแอปเปิดสตรีมเสียง คุณจะต้องปรับขนาดบัฟเฟอร์ที่ใช้งานได้ เพื่อเวลาในการตอบสนองที่เหมาะสมที่สุด โอโบตั้งค่าขนาดบัฟเฟอร์เป็น 2 จุดโดยอัตโนมัติ แต่ ด้วย AAudio ค่าเริ่มต้นจะสูงกว่า ใช้การบัฟเฟอร์คู่โดยตั้งค่า ขนาดบัฟเฟอร์เป็น 2 เท่า ขนาดภาพถ่ายอัจฉริยะคือ Callback สูงสุด ขนาด

เสียง:

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 การวัดเวลาในการตอบสนองไป-กลับ (อินพุตไปยังเอาต์พุต)

การกำหนดค่า เวลาในการตอบสนอง (ms)
ทำตามคำแนะนำทั้งหมด 20
โหมดประสิทธิภาพไม่ใช่เวลาในการตอบสนองต่ำ 205
ไม่เฉพาะตัว (แชร์) 26
44100 Hz (AAudio) 160
44100 Hz (Oboe SRC) 23
ไม่ใช้เอาต์พุต Callback (MMAP) 21
ไม่ใช้เอาต์พุต Callback (ไม่ใช่ MMAP) 62
กำหนดขนาดบัฟเฟอร์เป็นสูงสุด 53