อัตราเฟรม

ไลบรารี 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 โปรดดูที่

หากต้องการอ่านเพิ่มเติม โปรดดู ที่บรรลุการเว้นระยะเฟรมที่เหมาะสม

เฟรมต่อวินาที (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:

การโต้ตอบระหว่าง GameManagerService และ SurfaceFlinger

รูปที่ 1 การโต้ตอบระหว่าง GameServiceManager และ SurfaceFlinger

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

หากต้องการทำความเข้าใจเพิ่มเติมเกี่ยวกับการควบคุม FPS โปรดดู การแนะนำการควบคุม FPS