จังหวะเฟรม

ไลบรารี Android Frame Pacing หรือที่เรียกว่า Swappy เป็นส่วนหนึ่งของ Android Game SDK ช่วยให้เกม OpenGL และ Vulkan บรรลุการเรนเดอร์ที่ราบรื่นและแก้ไขการกำหนดอัตราเฟรมบน Android

การกำหนดจังหวะเฟรมคือการซิงโครไนซ์ตรรกะของเกมและลูปการเรนเดอร์กับระบบย่อยการแสดงผลของระบบปฏิบัติการและฮาร์ดแวร์การแสดงผลพื้นฐาน ระบบย่อยการแสดงผลของ Android ได้รับการออกแบบมาเพื่อหลีกเลี่ยงปัญหาการมองเห็นบางอย่าง เช่น ภาพฉีกขาด ระบบย่อยการแสดงผลหลีกเลี่ยงการฉีกขาดโดยทำดังต่อไปนี้:

  • บัฟเฟอร์เฟรมที่ผ่านมาภายใน
  • การตรวจจับการส่งเฟรมล่าช้า
  • แสดงเฟรมปัจจุบันต่อไปเมื่อตรวจพบเฟรมล่าช้า

เวลาแสดงเฟรมที่ไม่สอดคล้องกันเกิดจากการวนรอบการเรนเดอร์ของเกมที่ทำงานในอัตราที่แตกต่างจากที่ฮาร์ดแวร์จอแสดงผลเนทิฟรองรับ ปัญหาเกิดขึ้นเมื่อลูปการเรนเดอร์ของเกมทำงานช้าเกินไปสำหรับฮาร์ดแวร์การแสดงผลพื้นฐาน ส่งผลให้เวลาในการแสดงผลไม่สอดคล้องกัน ตัวอย่างเช่น เมื่อเกมที่ทำงานที่ 30 fps พยายามเรนเดอร์บนอุปกรณ์ที่รองรับ 60 fps ตามปกติ การเรนเดอร์ของเกมจะทำให้เฟรมที่ซ้ำกันยังคงอยู่บนหน้าจอเป็นเวลาพิเศษ 16 ms การตัดการเชื่อมต่อประเภทนี้ทำให้เกิดความไม่สอดคล้องกันอย่างมากในเวลาเฟรม เช่น 33 ms, 16 ms, 49 ms เป็นต้น ฉากที่ซับซ้อนมากเกินไปยิ่งทำให้ปัญหานี้เพิ่มมากขึ้น เนื่องจากจะทำให้เฟรมที่พลาดเกิดขึ้น

ไลบรารี Frame Pacing ดำเนินงานเหล่านี้:

  • ชดเชยอาการกระตุกเนื่องจากเฟรมเกมสั้น
    • เพิ่มการประทับเวลาการนำเสนอเพื่อให้เฟรมนำเสนอตรงเวลา ไม่ใช่เร็ว
    • ใช้ส่วนขยายการประทับเวลาการนำเสนอ EGL_ANDROID_presentation_time และ VK_GOOGLE_display_timing
  • ใช้รั้วการซิงค์สำหรับเฟรมที่ยาวซึ่งทำให้เกิดการกระตุกและเวลาในการตอบสนอง
    • การฉีดจะรออยู่ในแอป สิ่งเหล่านี้ช่วยให้ไปป์ไลน์การแสดงผลไล่ตาม แทนที่จะปล่อยให้แรงดันย้อนกลับก่อตัวขึ้น
    • ใช้รั้วการซิงค์ ( EGL_KHR_fence_sync และ VkFence )
  • เลือกอัตราการรีเฟรชเพื่อให้มีความยืดหยุ่นและการนำเสนอที่ราบรื่น หากอุปกรณ์ของคุณรองรับอัตราการรีเฟรชหลายอัตรา
  • จัดเตรียมสถิติสำหรับการดีบักและการทำโปรไฟล์โดยใช้ สถิติเฟรม

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

หากต้องการใช้งานโดยใช้ตัวเรนเดอร์ OpenGL หรือตัวเรนเดอร์ Vulkan โปรดดู

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

การแทรกแซงการควบคุมปริมาณเฟรมต่อวินาที

การแทรกแซงการควบคุมปริมาณเฟรมต่อวินาที (FPS) ช่วยให้เกมสามารถก้าวไปที่ 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