ไลบรารี Android Frame Pacing หรือที่เรียกว่า Swappy เป็นส่วนหนึ่งของ Android Game SDK ช่วยให้เกม OpenGL และ Vulkan บรรลุการเรนเดอร์ที่ราบรื่นและแก้ไขการกำหนดอัตราเฟรมบน Android
การกำหนดจังหวะเฟรมคือการซิงโครไนซ์ตรรกะของเกมและลูปการเรนเดอร์กับระบบย่อยการแสดงผลของระบบปฏิบัติการและฮาร์ดแวร์การแสดงผลพื้นฐาน ระบบย่อยการแสดงผลของ Android ได้รับการออกแบบมาเพื่อหลีกเลี่ยงปัญหาการมองเห็นบางอย่าง เช่น ภาพฉีกขาด ระบบย่อยการแสดงผลหลีกเลี่ยงการฉีกขาดโดยทำดังต่อไปนี้:
- บัฟเฟอร์เฟรมที่ผ่านมาภายใน
- การตรวจจับการส่งเฟรมล่าช้า
- แสดงเฟรมปัจจุบันต่อไปเมื่อตรวจพบเฟรมล่าช้า
เวลาแสดงเฟรมที่ไม่สอดคล้องกันเกิดจากการวนรอบการเรนเดอร์ของเกมที่ทำงานในอัตราที่แตกต่างจากที่ฮาร์ดแวร์จอแสดงผลเนทิฟรองรับ ปัญหาเกิดขึ้นเมื่อลูปการเรนเดอร์ของเกมทำงานช้าเกินไปสำหรับฮาร์ดแวร์การแสดงผลพื้นฐาน ส่งผลให้เวลาในการแสดงผลไม่สอดคล้องกัน ตัวอย่างเช่น เมื่อเกมที่ทำงานที่ 30 fps พยายามเรนเดอร์บนอุปกรณ์ที่รองรับ 60 fps ตามปกติ การเรนเดอร์ของเกมจะทำให้เฟรมที่ซ้ำกันยังคงอยู่บนหน้าจอเป็นเวลาพิเศษ 16 ms การตัดการเชื่อมต่อประเภทนี้ทำให้เกิดความไม่สอดคล้องกันอย่างมากในเวลาเฟรม เช่น 33 ms, 16 ms, 49 ms เป็นต้น ฉากที่ซับซ้อนมากเกินไปยิ่งทำให้ปัญหานี้เพิ่มมากขึ้น เนื่องจากจะทำให้เฟรมที่พลาดเกิดขึ้น
ไลบรารี Frame Pacing ดำเนินงานเหล่านี้:
- ชดเชยอาการกระตุกเนื่องจากเฟรมเกมสั้น
- เพิ่มการประทับเวลาการนำเสนอเพื่อให้เฟรมนำเสนอตรงเวลา ไม่ใช่เร็ว
- ใช้ส่วนขยายการประทับเวลาการนำเสนอ
EGL_ANDROID_presentation_time
และVK_GOOGLE_display_timing
- ใช้รั้วการซิงค์สำหรับเฟรมที่ยาวซึ่งทำให้เกิดการกระตุกและเวลาในการตอบสนอง
- การฉีดจะรออยู่ในแอป สิ่งเหล่านี้ช่วยให้ไปป์ไลน์การแสดงผลไล่ตาม แทนที่จะปล่อยให้แรงดันย้อนกลับก่อตัวขึ้น
- ใช้รั้วการซิงค์ (
EGL_KHR_fence_sync
และVkFence
)
- เลือกอัตราการรีเฟรชเพื่อให้มีความยืดหยุ่นและการนำเสนอที่ราบรื่น หากอุปกรณ์ของคุณรองรับอัตราการรีเฟรชหลายอัตรา
- จัดเตรียมสถิติสำหรับการดีบักและการทำโปรไฟล์โดยใช้ สถิติเฟรม
หากต้องการเรียนรู้วิธีกำหนดค่าไลบรารีให้ทำงานในโหมดต่างๆ ตามที่คุณต้องการ โปรดดูที่ โหมดการทำงานที่รองรับ
หากต้องการใช้งานโดยใช้ตัวเรนเดอร์ OpenGL หรือตัวเรนเดอร์ Vulkan โปรดดู
- ผสานรวม Android Frame Pacing เข้ากับตัวเรนเดอร์ OpenGL ของคุณ
- ผสานรวม Android Frame Pacing เข้ากับตัวเรนเดอร์ Vulkan ของคุณ
หากต้องการอ่านเพิ่มเติม โปรดดู ที่ บรรลุการกำหนดอัตราเฟรมที่เหมาะสม
การแทรกแซงการควบคุมปริมาณเฟรมต่อวินาที
การแทรกแซงการควบคุมปริมาณเฟรมต่อวินาที (FPS) ช่วยให้เกมสามารถก้าวไปที่ FPS ที่เหมาะสมโดยใช้การเปลี่ยนแปลงด้านแพลตฟอร์มเท่านั้น และไม่จำเป็นต้องดำเนินการใดๆ ในส่วนของผู้พัฒนา
การใช้งานการแทรกแซงการควบคุมปริมาณ FPS จะใช้ส่วนประกอบต่อไปนี้:
บริการผู้จัดการเกม
ส่วนประกอบ GameManagerService จะรักษาข้อมูลต่อผู้ใช้และต่อเกมทั้งหมดของโหมดเกมและการแทรกแซงของเกม ข้อมูล FPS จะถูกจัดเก็บไว้ใน GameManagerService พร้อมด้วยข้อมูลการแทรกแซงอื่นๆ เช่น ปัจจัยการลดขนาดความละเอียด ในการแมป <PACKAGE_NAME, Interventions>
สำหรับแต่ละโปรไฟล์ผู้ใช้ ข้อมูล FPS จะถูกเข้าถึงเมื่อโหมดเกมมีการเปลี่ยนแปลงหรืออัปเดตการแทรกแซง UID
มีเอกลักษณ์เฉพาะสำหรับ PACKAGE_NAME
และผู้ใช้แต่ละราย และสามารถแปลเพิ่มเติมเป็นคู่ <UID, Frame Rate>
เพื่อส่งไปยัง SurfaceFlinger
SurfaceFlinger
ส่วนประกอบ SurfaceFlinger รองรับการควบคุมปริมาณ FPS ของแอปพลิเคชันอยู่แล้ว ตราบใดที่อัตราเฟรมเป็นตัวหารของอัตรารีเฟรชของจอแสดงผล ในกรณีของ vsync นั้น SurfaceFlinger จะตรวจสอบความถูกต้องของ vsync สำหรับแอปพลิเคชันที่ถูกควบคุมโดยตรวจสอบว่าการประทับเวลา vsync อยู่ในเฟสตามอัตราเฟรมของแอปพลิเคชันหรือไม่ หากอัตราเฟรมไม่อยู่ในเฟสกับ vsync SurfaceFlinger จะคงเฟรมไว้จนกว่าอัตราเฟรมและ vsync จะอยู่ในเฟส
รูปต่อไปนี้อธิบายการโต้ตอบระหว่าง GameManagerService และ SurfaceFlinger:
SurfaceFinger รักษาการจับคู่ <UID, Frame Rate>
เพื่อตั้งค่าลำดับความสำคัญในการควบคุมอัตราเฟรมใหม่ UID
นั้นแตกต่างกันระหว่างผู้ใช้และเกม ดังนั้นผู้ใช้แต่ละคนบนอุปกรณ์เครื่องเดียวสามารถมีการตั้งค่าอัตราเฟรมที่แตกต่างกันในเกมเดียวกันได้ หากต้องการควบคุมอัตราเฟรมของเกม GameServiceManager จะเรียก SurfaceFlinger เพื่อแทนที่อัตราเฟรมสำหรับ UID ด้วยกลไกนี้ SurfaceFlinger จะอัปเดตการแมปทุกครั้งที่เปลี่ยนโหมดเกมหรืออัปเดตการแทรกแซง SurfaceFlinger จัดการการเปลี่ยนแปลง FPS โดยการล็อคบัฟเฟอร์ตามลำดับ
หากต้องการทำความเข้าใจเพิ่มเติมเกี่ยวกับการควบคุมปริมาณ FPS โปรดดู บทแนะนำการควบคุมปริมาณ FPS