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