การกำหนดเฟรม

ไลบรารีการเว้นวรรคเฟรมของ 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 Fences สำหรับเฟรมที่ยาวซึ่งทำให้เกิดการกระตุกและเวลาในการตอบสนอง
    • แทรกการรอลงในแอป ซึ่งจะช่วยให้ไปป์ไลน์การแสดงผลตามทัน แทนที่จะปล่อยให้เกิดแรงดันย้อนกลับ
    • ใช้รั้วการซิงค์ (EGL_KHR_fence_sync และ VkFence)
  • เลือกอัตราการรีเฟรชเพื่อให้มีความยืดหยุ่นและนำเสนอได้อย่างราบรื่น หากอุปกรณ์รองรับอัตราการรีเฟรชหลายรายการ
  • แสดงสถิติสำหรับการแก้ไขข้อบกพร่องและการสร้างโปรไฟล์โดยใช้ frame stats

ดูวิธีกำหนดค่าไลบรารีให้ทำงานในโหมดต่างๆ ตามที่คุณต้องการได้ที่โหมดการทำงานที่รองรับ

หากต้องการใช้ตัวแสดงผล OpenGL หรือตัวแสดงผล 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

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

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

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับการจำกัด FPS ได้ที่ การจำกัด FPS