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

รูปที่ 1 การโต้ตอบระหว่าง GameServiceManager และ SurfaceFlinger
SurfaceFinger รักษาการแมปคู่ <UID, Frame Rate>
เพื่อตั้งค่าลำดับความสำคัญการควบคุมอัตราเฟรมใหม่ UID
นั้นไม่ซ้ำกันระหว่างผู้ใช้และเกม ดังนั้นผู้ใช้แต่ละคนบนอุปกรณ์เครื่องเดียวสามารถตั้งค่าเฟรมเรตที่แตกต่างกันในเกมเดียวกันได้ เพื่อเร่งอัตราเฟรมของเกม GameServiceManager จะเรียก SurfaceFlinger เพื่อแทนที่อัตราเฟรมสำหรับ UID ด้วยกลไกนี้ SurfaceFlinger จะอัปเดตการแมปเมื่อใดก็ตามที่โหมดเกมเปลี่ยนแปลงหรืออัปเดตการแทรกแซง SurfaceFlinger จัดการการเปลี่ยนแปลง FPS โดยการล็อคบัฟเฟอร์ตามนั้น
หากต้องการทำความเข้าใจเพิ่มเติมเกี่ยวกับการควบคุม FPS โปรดดู การแนะนำการควบคุม FPS