ไลบรารี Android Frame Pacing หรือที่รู้จักกันในชื่อ Swappy เป็นส่วนหนึ่งของ Android Game SDK ช่วยให้เกม OpenGL และ Vulkan แสดงผลได้อย่างราบรื่น และกำหนดอัตราเฟรมที่ถูกต้องใน Android ได้
การกำหนดอัตราการแสดงโฆษณาเฟรมคือการซิงค์ลอจิกและลูปการแสดงผลของเกมกับ ระบบย่อยของจอแสดงผลระบบปฏิบัติการและฮาร์ดแวร์การแสดงผลที่ใช้ จอแสดงผล Android ระบบย่อยได้รับการออกแบบมาเพื่อหลีกเลี่ยงสิ่งแปลกปลอมทางภาพบางอย่าง เช่น การฉีกขาด เพื่อหลีกเลี่ยงการฉีกขาด โดยทำดังนี้
- การบัฟเฟอร์เฟรมที่ผ่านไปแล้วภายใน
- กำลังตรวจหาการส่งเฟรมล่าช้า
- แสดงเฟรมปัจจุบันต่อไปเมื่อตรวจพบเฟรมที่ล่าช้า
เวลาแสดงเฟรมที่ไม่สอดคล้องกันอาจเกิดจากการวนแสดงผลของเกมที่ใช้เวลา เป็นอัตราที่แตกต่างจากที่ฮาร์ดแวร์จอแสดงผลในเครื่องรองรับ เกิดปัญหาขึ้น เมื่อลูปการแสดงผลของเกมทำงานช้าเกินไปสำหรับฮาร์ดแวร์แสดงผลที่ใช้ ซึ่งทำให้เวลาที่แสดงไม่สม่ำเสมอ ตัวอย่างเช่น เมื่อเกมเผยแพร่ที่ 30 FPS พยายามแสดงผลบนอุปกรณ์ที่รองรับ 60 FPS ตั้งแต่แรก ลูปการแสดงผลของเกมจะทำให้เฟรมซ้ำยังคงอยู่บนหน้าจอเป็นเวลา เพิ่มเติม 16 มิลลิวินาที การยกเลิกการเชื่อมต่อประเภทนี้ทำให้เกิดความไม่สอดคล้องกันอย่างมากในเวลาที่ใช้ในการแสดงผลเฟรม เช่น 33 มิลลิวินาที, 16 มิลลิวินาที, 49 มิลลิวินาที เป็นต้น เพิ่มฉากที่ซับซ้อนเกินไป ปัญหานี้เพราะทำให้เฟรมพลาด
ไลบรารี Frame Pacing จะดำเนินการต่อไปนี้
- ชดเชยการกระตุกเนื่องจากเฟรมเกมสั้น
- เพิ่มการประทับเวลาการนำเสนอเพื่อให้นำเสนอเฟรมตรงเวลา ไม่ใช่ ตั้งแต่เนิ่นๆ
- ใช้ส่วนขยายการประทับเวลางานนำเสนอ
EGL_ANDROID_presentation_time
และVK_GOOGLE_display_timing
- ใช้รั้วที่ซิงค์สำหรับเฟรมแบบยาวที่ทำให้เกิดการกระตุกและเวลาในการตอบสนอง
- การแทรกจะรอเข้าไปในแอป ซึ่งช่วยให้ไปป์ไลน์การแสดงผลสามารถตรวจจับ แทนที่จะให้แรงกดดันด้านหลังเพิ่มมากขึ้น
- ใช้รั้วซิงค์ (
EGL_KHR_fence_sync
และVkFence
)
- เลือกอัตราการรีเฟรช เพื่อให้การนำเสนอที่ยืดหยุ่นและราบรื่น หากอุปกรณ์รองรับอัตราการรีเฟรชหลายอัตรา
- ระบุสถิติสำหรับการแก้ไขข้อบกพร่องและการทำโปรไฟล์โดยใช้ frame สถิติ
เพื่อดูวิธีกำหนดค่าไลบรารีให้ทำงานในโหมดต่างๆ ดูโหมดการทํางานที่รองรับ
หากต้องการติดตั้งใช้งานโดยใช้ตัวแสดงผล OpenGL หรือตัวแสดงผล Vulkan โปรดดู
- ผสานรวมการกำหนดอัตราการแสดงโฆษณาของ Android Frame เข้ากับโหมดแสดงภาพ OpenGL
- ผสานรวม Android Frame Pacing กับโหมดแสดงภาพ Vulkan
โปรดดูข้อมูลเพิ่มเติมที่หัวข้อใช้จังหวะเฟรมที่เหมาะสม
การแทรกแซงการควบคุมจำนวนเฟรมต่อวินาที
การควบคุมการควบคุมเฟรมต่อวินาที (FPS) ช่วยให้เกมมีจังหวะที่ FPS ที่เหมาะสม โดยใช้เพียงฝั่งแพลตฟอร์ม เปลี่ยนแปลงโดยที่นักพัฒนาแอปไม่ต้องดำเนินการใดๆ
การใช้การฝึกฝนการควบคุม FPS จะใช้คอมโพเนนต์ต่อไปนี้
บริการจัดการเกม
คอมโพเนนต์ GameManagerService จะเก็บรักษาผู้ใช้ทั้งหมดและ
ข้อมูลของแต่ละเกมของโหมดเกมและการแทรกแซงเกม ข้อมูล FPS มีการจัดเก็บไว้ใน
GameManagerService ที่มีข้อมูลการแทรกแซงอื่นๆ เช่น ปัจจัยการปรับลดความละเอียด
ในการแมป <PACKAGE_NAME, Interventions>
สำหรับโปรไฟล์ผู้ใช้แต่ละรายการ
ระบบจะเข้าถึงข้อมูล FPS เมื่อมีการเปลี่ยนแปลงโหมดเกมหรือมีการอัปเดตการแทรกแซง ต
UID
จะไม่ซ้ำกันสำหรับ PACKAGE_NAME
และผู้ใช้แต่ละราย และแปลเพิ่มเติมได้
เป็นคู่ <UID, Frame Rate>
เพื่อส่งไปยัง SurfaceFlinger
Flinger
คอมโพเนนต์ SurfaceFlinger รองรับอยู่แล้ว การควบคุม FPS ของแอปพลิเคชันตราบใดที่อัตราเฟรมเป็นตัวหารของอัตราการรีเฟรชจอแสดงผล ในกรณีที่เป็น vsync แพลตฟอร์ม SurfaceFlinger จะตรวจสอบความถูกต้องของ vsync สำหรับตัวควบคุมนั้น โดยตรวจสอบว่าการประทับเวลา vsync อยู่ในระยะที่มีอัตราเฟรมของ แอปพลิเคชัน หากอัตราเฟรมไม่ได้อยู่ในเฟสกับ vsync แพลตฟอร์ม SurfaceFlinger จะคงค่า จนกว่าอัตราเฟรมและ vsync จะอยู่ในเฟส
รูปต่อไปนี้อธิบายการโต้ตอบระหว่าง GameManagerService และ SurfaceFlinger
SurfaceFinger จะเก็บรักษาการจับคู่ <UID, Frame Rate>
ไว้เพื่อตั้งค่า
ลำดับความสำคัญของการควบคุมอัตราเฟรม UID
จะไม่ซ้ำกันระหว่างผู้ใช้กับเกม ดังนั้นแต่ละ
บนอุปกรณ์เครื่องหนึ่งอาจมีการตั้งค่าอัตราเฟรมต่างกันในเกมเดียวกัน หากต้องการควบคุม
อัตราเฟรมของเกม GameServiceManager จะเรียก SurfaceFlinger เพื่อลบล้างอัตราเฟรมสำหรับ
UID เมื่อใช้กลไกนี้ SurfaceFlinger จะอัปเดตการแมปเมื่อใดก็ตามที่
โหมดเกมมีการเปลี่ยนแปลงหรือมีการอัปเดตการแทรกแซง SurfaceFlinger จัดการการเปลี่ยนแปลง FPS
ด้วยการสลักบัฟเฟอร์ให้ตรงกัน
หากต้องการทำความเข้าใจเพิ่มเติมเกี่ยวกับการควบคุม FPS โปรดดู ข้อมูลเบื้องต้นเกี่ยวกับการควบคุม FPS