ไลบรารีการกำหนดเฟรมของ Android หรือที่เรียกว่า Swappy เป็นส่วนหนึ่งของ Android Game SDK ซึ่งจะช่วยให้เกม OpenGL และ Vulkan แสดงผลได้อย่างราบรื่นและอัตราเฟรมถูกต้องบน Android
การกำหนดเฟรมเป็นการกำหนดเวลาของตรรกะและลูปการแสดงผลของเกมให้สอดคล้องกับระบบย่อยการแสดงผลของ OS และฮาร์ดแวร์การแสดงผลที่เกี่ยวข้อง ระบบย่อยของจอแสดงผล 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 เมื่อเปลี่ยนโหมดเกมหรืออัปเดตการแทรกแซง 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 โปรดดูหัวข้อ intro การจำกัด FPS