ไลบรารีการควบคุมจังหวะเฟรมของ 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
- ใช้รั้วการซิงค์สำหรับเฟรมยาวที่ทำให้เกิดการกระตุกแบบข้ามเฟรมและเวลาในการตอบสนอง
- แทรกการรอลงในแอป ซึ่งจะช่วยให้ไปป์ไลน์การแสดงผลตามทัน แทนที่จะปล่อยให้เกิดแรงดันย้อนกลับ
- ใช้รั้วการซิงค์ (
EGL_KHR_fence_syncและVkFence)
- เลือกรีเฟรชเรตเพื่อให้มีความยืดหยุ่นและนำเสนอได้อย่างราบรื่น หากอุปกรณ์รองรับรีเฟรชเรตหลายรายการ
- ให้สถิติสำหรับการแก้ไขข้อบกพร่องและการสร้างโปรไฟล์โดยใช้ สถิติเฟรม
ดูวิธีกำหนดค่าไลบรารีให้ทำงานในโหมดต่างๆ ตามที่คุณต้องการได้ที่โหมดการทำงานที่รองรับ
หากต้องการใช้ตัวแสดงผล OpenGL หรือตัวแสดงผล Vulkan ให้ดูที่
- ผสานรวมการควบคุมจังหวะเฟรมของ Android เข้ากับตัวแสดงผล OpenGL
- ผสานรวมการควบคุมจังหวะเฟรมของ Android เข้ากับตัวแสดงผล Vulkan
ดูข้อมูลเพิ่มเติมได้ที่ ไลบรารีการควบคุมจังหวะเฟรม
การแทรกแซงการควบคุมปริมาณเฟรมต่อวินาที
การแทรกแซงการควบคุมปริมาณเฟรมต่อวินาที (FPS) ช่วยให้เกมควบคุมจังหวะที่ FPS ที่เหมาะสมได้โดยใช้การเปลี่ยนแปลงฝั่งแพลตฟอร์มเท่านั้น และไม่จำเป็นต้องให้นักพัฒนาแอปดำเนินการใดๆ
การใช้งานการแทรกแซงการควบคุมปริมาณ FPS ใช้คอมโพเนนต์ต่อไปนี้
GameManagerService
คอมโพเนนต์
GameManagerService จะเก็บข้อมูลโหมดเกมและการแทรกแซงเกมทั้งหมดของผู้ใช้แต่ละคนและ
เกมแต่ละเกม ข้อมูล FPS จะจัดเก็บไว้ใน
GameManagerService พร้อมกับข้อมูลการแทรกแซงอื่นๆ เช่น ปัจจัยการลดขนาดความละเอียด
ในการแมป <PACKAGE_NAME, Interventions> สำหรับโปรไฟล์ผู้ใช้แต่ละโปรไฟล์
ระบบจะเข้าถึงข้อมูล FPS เมื่อมีการเปลี่ยนโหมดเกมหรืออัปเดตการแทรกแซง A
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