เซสชันเกมที่ช้าคือเซสชันที่มีเฟรมจำนวนมาก (เช่น เฟรมมากกว่า 25%) ไม่เป็นไปตามเวลาที่ใช้ในการแสดงผลเฟรมเป้าหมาย เช่น 50 มิลลิวินาทีต่อเฟรม (เทียบเท่ากับ 20 FPS) หรือ 34 มิลลิวินาทีต่อเฟรม (เทียบเท่ากับ 30 FPS) การตรวจสอบและเพิ่มประสิทธิภาพอัตราเฟรมมีความสําคัญอย่างยิ่งเนื่องจากเฟรมที่ขาดหายไปหรือเฟรมที่ล่าช้าส่งผลโดยตรงต่อความลื่นไหลและการตอบสนองของเกมสำหรับผู้เล่น
ใน Android ระบบจะวัดอัตราเฟรมของเซสชันโดยใช้ข้อมูลจาก SurfaceFlinger ตามช่วงเวลา
ระหว่างเฟรมที่วาดบนแพลตฟอร์มที่เกมเป็นเจ้าของ (รวมถึงแพลตฟอร์ม OpenGL, Vulkan และ Android UI
toolkit) หากแอปใช้ชุดเครื่องมือ UI ที่อิงตาม View ซึ่งส่วนที่ผู้ใช้มองเห็นของแอปดึงมาจาก Canvas หรือลำดับชั้น View โปรดดูการแสดงผลช้า
วิธีวัด FPS และตรวจหาเฟรมที่ช้า
คำสั่ง dumpsys surfaceflinger timestats ของ Android จะแสดง FPS เฉลี่ยและฮิสโทแกรมเวลาแสดงต่อแสดงสำหรับเลเยอร์ทั้งหมดที่กำลังแสดงผล เวลาปัจจุบันถึงปัจจุบันของเฟรมคือช่วงเวลาระหว่าง
เฟรมปัจจุบันกับเฟรมก่อนหน้าที่มีการวาด ขั้นตอนการใช้คำสั่งเพื่อรวบรวม FPS ของเกมมีดังนี้
เรียกใช้คำสั่งด้วย Flag
enableและclearเพื่อเริ่มบันทึกข้อมูลadb shell dumpsys SurfaceFlinger --timestats -clear -enableเมื่อเล่นเกมเป็นเวลานานพอแล้ว ให้เรียกใช้คำสั่งอีกครั้งโดยใช้แฟล็ก
dumpเพื่อดัมพ์ข้อมูลadb shell dumpsys SurfaceFlinger --timestats -dumpข้อมูลที่ส่งออกจะแสดงเฟรมทั้งหมดและฮิสโตแกรม presentToPresent สำหรับ เลเยอร์ทั้งหมดที่ SurfaceFlinger แสดงผล คุณต้องค้นหา ส่วนของเกมโดยการกรองตาม
layerNamelayerName = SurfaceView[com.google.test/com.devrel.MainActivity]@0(BLAST)#132833ระบบจะคำนวณอัตราเฟรมที่ช้าของเซสชันตามข้อมูลของ แต่ละเลเยอร์
เช่น เปอร์เซ็นต์เฟรมที่ช้า 20 FPS = (ผลรวมของค่าตั้งแต่ 54 มิลลิวินาทีถึง 1, 000 มิลลิวินาที) / totalFrames x 100
totalFrames = 274 ... presentToPresent histogram is as below: 0ms=0 1ms=0 2ms=0 3ms=0 4ms=0 5ms=0 6ms=0 7ms=0 8ms=0 9ms=0 10ms=0 11ms=0 12ms=0 13ms=0 14ms=0 15ms=0 16ms=1 17ms=0 18ms=0 19ms=0 20ms=0 21ms=0 22ms=0 23ms=0 24ms=0 25ms=0 26ms=0 27ms=0 28ms=0 29ms=0 30ms=0 31ms=0 32ms=0 33ms=269 34ms=0 36ms=0 38ms=0 40ms=0 42ms=0 44ms=0 46ms=0 48ms=0 50ms=1 54ms=0 58ms=0 62ms=0 66ms=0 70ms=1 74ms=0 78ms=0 82ms=0 86ms=0 90ms=0 94ms=0 98ms=0 102ms=0 106ms=0 110ms=0 114ms=0 118ms=0 122ms=0 126ms=0 130ms=0 134ms=0 138ms=0 142ms=0 146ms=0 150ms=0 200ms=0 250ms=0 300ms=0 350ms=0 400ms=0 450ms=0 500ms=0 550ms=0 600ms=0 650ms=0 700ms=0 750ms=0 800ms=0 850ms=0 900ms=0 950ms=0 1000ms=0นอกจากนี้ยังแสดง FPS เฉลี่ยของแต่ละเลเยอร์ในการดัมพ์ด้วย
... averageFPS = 30.179 ...หลังจากรวบรวมข้อมูลทั้งหมดแล้ว คุณควรปิดใช้ timestats โดยใช้แฟล็ก
disableดังนี้adb shell dumpsys SurfaceFlinger --timestats -disable
สาเหตุและวิธีแก้ปัญหาเฟรมที่ช้า
มีหลายสาเหตุที่เฟรมอาจแสดงหรือแสดงผลบนหน้าจอนานกว่าเป้าหมายของนักพัฒนาแอป เกมอาจขึ้นอยู่กับ CPU/GPU หรือ อุปกรณ์ร้อนเกินไปและเปิดใช้งานสถานะความร้อนที่ถูกจำกัด หรืออัตราเฟรมของเกมไม่ตรงกับอัตราการรีเฟรชของจอแสดงผลในอุปกรณ์
ใช้ Android Frame Pacing (Swappy), Vulkan และ ADPF เพื่อ แก้ไขปัญหาเหล่านี้และปรับปรุงประสิทธิภาพของเกม
Swappy คืออะไร
ไลบรารีการเว้นเฟรมของ Android หรือที่เรียกว่า Swappy เป็นส่วนหนึ่งของไลบรารี AGDK Swappy ช่วยให้เกม OpenGL และ Vulkan แสดงผลได้อย่างราบรื่นและมีอัตราเฟรมที่ถูกต้องใน Android
การเว้นเฟรมคือการซิงค์ตรรกะของเกมและลูปการแสดงผลกับ ระบบย่อยการแสดงผลของระบบปฏิบัติการและฮาร์ดแวร์การแสดงผลพื้นฐาน ระบบย่อยการแสดงผลของ Android ได้รับการออกแบบมาเพื่อหลีกเลี่ยงอาร์ติแฟกต์ภาพ (ที่เรียกว่าภาพขาด) ซึ่งอาจเกิดขึ้นเมื่อฮาร์ดแวร์จอแสดงผลเปลี่ยนไปใช้เฟรมใหม่กลางคัน ระหว่างการอัปเดต ระบบย่อยการแสดงผลจะทำสิ่งต่อไปนี้เพื่อหลีกเลี่ยงอาร์ติแฟกต์เหล่านี้
- บัฟเฟอร์เฟรมที่ผ่านมาภายใน
- ตรวจหาการส่งเฟรมล่าช้า
- แสดงเฟรมที่ผ่านมาซ้ำเมื่อตรวจพบเฟรมที่ล่าช้า
ดูวิธีที่ Mir 2 ใช้ Swappy เพื่อลดอัตราเซสชันที่ช้าจาก 40% เป็น 10%
วิธีใช้ Swappy ในโปรเจ็กต์ดั้งเดิม
ดูคำแนะนำต่อไปนี้เพื่อผสานรวมไลบรารีการเว้นวรรคเฟรมของ Android เข้ากับเกม
- ผสานรวม Android Frame Pacing เข้ากับตัวเรนเดอร์ OpenGL
- ผสานรวมการเว้นวรรคเฟรมของ Android เข้ากับโปรแกรมแสดงผล Vulkan
วิธีใช้ Swappy ในเกมเอนจิน Unity
Unity ได้ผสานรวมการเว้นวรรคเฟรมของ Android เข้ากับเอนจินของตน หากต้องการเปิดใช้ฟีเจอร์นี้ใน Unity 2019.2 ขึ้นไป ให้เลือกช่องทำเครื่องหมายการเว้นวรรคเฟรมที่เพิ่มประสิทธิภาพในส่วนการตั้งค่าโปรเจ็กต์ > เครื่องเล่น > การตั้งค่าสำหรับ Android > ความละเอียดและการนำเสนอ
หรือจะเปิดใช้ตัวเลือกการเว้นระยะเฟรมที่เพิ่มประสิทธิภาพในโค้ดตรรกะแบบเป็นโปรแกรมก็ได้ เพื่อให้ Unity กระจายเฟรมอย่างสม่ำเสมอเพื่อลดความแปรปรวนของอัตราเฟรม ซึ่งจะช่วยให้การเล่นเกมราบรื่นขึ้น
วิธีใช้ Swappy ใน Unreal Game Engine
Unreal 4.25 ขึ้นไปผสานรวม Android Frame Pacing Library ซึ่งเป็นส่วนหนึ่งของ Android Game Development Kit บทความการเว้นเฟรมสำหรับอุปกรณ์เคลื่อนที่อธิบายวิธีเปิดใช้ไลบรารีการเว้นเฟรมของ Android และวิธีควบคุมการเว้นเฟรมจากโค้ด C++
Vulkan คืออะไร
Vulkan เป็น API กราฟิก 3 มิติแบบข้ามแพลตฟอร์มสมัยใหม่ที่ออกแบบมาเพื่อลดการแยกส่วนระหว่างฮาร์ดแวร์กราฟิกของอุปกรณ์ กับเกมของคุณ Vulkan เป็น API กราฟิกแบบระดับต่ำหลักใน Android ซึ่งมาแทนที่ OpenGL ES Android ยังคงรองรับ OpenGL ES แต่จะไม่ได้รับการพัฒนาฟีเจอร์อีก
Vulkan มีข้อได้เปรียบกว่า OpenGL ES ดังนี้
- สถาปัตยกรรมที่มีประสิทธิภาพมากขึ้นและมีค่าใช้จ่าย CPU ที่ต่ำกว่าในไดรเวอร์กราฟิก
- กลยุทธ์การเพิ่มประสิทธิภาพใหม่เพื่อปรับปรุงประสิทธิภาพ CPU
- ฟีเจอร์กราฟิกใหม่ๆ ที่ไม่พร้อมใช้งานใน OpenGL ES เช่น API แบบไม่ผูกมัดและ การติดตามรังสี
วิธีใช้ Vulkan ในโปรเจ็กต์ Android แบบเนทีฟ
Codelab การเริ่มต้นใช้งาน Vulkan ใน Android จะแนะนำวิธีตั้งค่า ไปป์ไลน์การแสดงผล Vulkan แล้วแสดงผลสามเหลี่ยมหมุนที่มีพื้นผิว บนหน้าจอ ใช้ Codelab เพื่อดูวิธีแสดงผลกราฟิกของเกม
วิธีใช้ Vulkan ในเกมเอนจิน Unity
หากต้องการเปิดใช้การเลือกอุปกรณ์อัตโนมัติใน Unity ให้ทำตามขั้นตอนเพื่อกำหนดค่า Auto Graphics API
หรือคุณจะเปิดใช้ Vulkan ด้วยตนเองได้โดยปิดใช้ Auto Graphics API และกำหนดให้ Vulkan มีลำดับความสำคัญสูงสุดในรายการ Graphics API หากคุณใช้ Unity 2021.1 หรือเวอร์ชันก่อนหน้า นี่เป็นวิธีเดียวที่จะใช้ Vulkan ได้
ใช้ปลั๊กอินเอนจิน Unity ของ VkQuality เพื่อแสดงคำแนะนำเกี่ยวกับ Graphics API ที่จะใช้ในเกมเมื่อเปิดตัว ในอุปกรณ์ที่เฉพาะเจาะจง
วิธีใช้ Vulkan ในเกมเอนจิน Unreal
หากต้องการเปิดใช้ Vulkan Graphics API ให้ไปที่การตั้งค่าโปรเจ็กต์ > แพลตฟอร์ม > Android > บิลด์ แล้วเลือกรองรับ Vulkan เมื่อเลือกทั้งรองรับ Vulkan และรองรับ OpenGL ES3.2 Unreal จะใช้ Vulkan โดยค่าเริ่มต้น หากอุปกรณ์ไม่รองรับ Vulkan Unreal จะกลับไปใช้ OpenGL ES 3.2
หากใช้ฟีเจอร์ Vulkan บางอย่างที่ทราบว่าทำงานได้ไม่ดีในอุปกรณ์บางรุ่น คุณสามารถปรับแต่งไฟล์ BaseDeviceProfile.ini เพื่อยกเว้นอุปกรณ์เหล่านั้นได้ ดูการปรับแต่งโปรไฟล์อุปกรณ์และความสามารถในการปรับขนาด
สำหรับ Android เพื่อดูวิธี
ปรับแต่ง BaseDeviceProfile.ini เนื่องจากไดรเวอร์อุปกรณ์ใหม่อาจแก้ไขอุปกรณ์ที่ไม่ดีที่ทราบมาก่อนได้ โปรดอัปเดตไฟล์ BaseDeviceProfile.ini เพื่อรับการเพิ่มประสิทธิภาพทั้งหมด
ADPF คืออะไร
เฟรมเวิร์กประสิทธิภาพไดนามิก Android (ADPF) จะเพิ่มประสิทธิภาพเกมตามฟีเจอร์การจัดการความร้อน, CPU และ GPU แบบไดนามิก ใน Android ฟีเจอร์นี้เน้นที่เกม แต่คุณก็ใช้ฟีเจอร์นี้กับแอปอื่นๆ ที่ต้องใช้ประสิทธิภาพสูงได้เช่นกัน
ADPF คือชุด API ที่ช่วยให้เกมและแอปที่เน้นประสิทธิภาพ โต้ตอบกับระบบพลังงานและความร้อนของอุปกรณ์ Android ได้โดยตรงมากขึ้น API เหล่านี้ช่วยให้คุณตรวจสอบลักษณะการทำงานแบบไดนามิกในระบบ Android และเพิ่มประสิทธิภาพของเกมในระดับที่ยั่งยืนซึ่งไม่ทำให้อุปกรณ์ร้อนเกินไปได้
ฟีเจอร์หลักของ ADPF มีดังนี้
- Thermal API: ตรวจสอบสถานะความร้อนของอุปกรณ์เพื่อให้แอปพลิเคชันปรับปริมาณงานได้อย่างรวดเร็วทันทีที่เริ่มมีแนวโน้มว่าอาจไม่สามารถรองรับได้
- CPU Performance Hint API: ให้คำแนะนำด้านประสิทธิภาพที่ช่วยให้ Android เลือกการตั้งค่าประสิทธิภาพที่เหมาะสม (เช่น จุดปฏิบัติการหรือคอร์ของ CPU) สำหรับภาระงาน
- Game Mode API และ Game State API: เปิดใช้การเพิ่มประสิทธิภาพการเล่นเกมโดยจัดลําดับความสําคัญของลักษณะประสิทธิภาพหรือระยะเวลาการใช้งานแบตเตอรี่ตามการตั้งค่าของผู้ใช้และการกําหนดค่าเฉพาะเกม
- โหมดประสิทธิภาพคงที่: เปิดใช้โหมดประสิทธิภาพคงที่ในอุปกรณ์ระหว่างการเปรียบเทียบเพื่อรับการวัดที่ไม่ได้เปลี่ยนแปลงโดยการกำหนดเวลา CPU แบบไดนามิก
- โหมดประสิทธิภาพด้านพลังงาน: บอกเซสชันว่าสามารถกำหนดเวลาเธรดในเซสชันคำแนะนำด้านประสิทธิภาพได้อย่างปลอดภัยเพื่อให้ความสำคัญกับประสิทธิภาพด้านพลังงานมากกว่าประสิทธิภาพ พร้อมใช้งานใน Android 15 (API ระดับ 35)
วิธีใช้ ADPF ในโปรเจ็กต์ Android ดั้งเดิม
Codelab การผสานรวมฟีเจอร์ความสามารถในการปรับตัวเข้ากับเกมเนทีฟจะแนะนำวิธีผสานรวมฟีเจอร์ ADPF เข้ากับเกม ของคุณด้วยขั้นตอนที่คุณทำตามได้ตามต้องการ เมื่อสิ้นสุด Codelab คุณจะผสานรวมฟีเจอร์ต่อไปนี้ได้
- Thermal API: ฟังเงื่อนไขความร้อนของอุปกรณ์และตอบสนองก่อนที่อุปกรณ์จะเข้าสู่สถานะการควบคุมปริมาณความร้อน
- API โหมดเกม: ทำความเข้าใจค่ากำหนดการเพิ่มประสิทธิภาพของผู้เล่น (เพิ่มประสิทธิภาพสูงสุดหรือประหยัดแบตเตอรี่) และปรับตามนั้น
- Game State API: แจ้งให้ระบบทราบสถานะของเกม (กำลังโหลด กำลังเล่น UI ฯลฯ) แล้วระบบจะปรับทรัพยากรตามนั้น (เพิ่ม I/O หรือ CPU, GPU ฯลฯ)
- Performance Hint API: แจ้งให้ระบบทราบรูปแบบการทำงานแบบหลายเธรดและปริมาณงาน เพื่อให้ระบบจัดสรรทรัพยากรได้อย่างเหมาะสม
วิธีใช้ ADPF ในเกมเอนจิน Unity
Adaptive Performance ของ Unity เป็นเครื่องมือสำหรับนักพัฒนาเกมที่ต้องการเพิ่มประสิทธิภาพเกมในอุปกรณ์เคลื่อนที่ โดยเฉพาะอย่างยิ่งสำหรับระบบนิเวศ Android ที่หลากหลาย Adaptive Performance ช่วยให้ เกมปรับให้เข้ากับประสิทธิภาพและลักษณะความร้อนของอุปกรณ์ได้แบบ เรียลไทม์ เพื่อให้มั่นใจว่าผู้ใช้จะได้รับประสบการณ์การเล่นเกมที่ราบรื่นและมีประสิทธิภาพ
ผู้ให้บริการ Android Adaptive Performance จะแนะนำขั้นตอนการติดตั้งใช้งาน ADPF ใน Unity
วิธีใช้ ADPF ในเกมเอนจิน Unreal
- ดาวน์โหลดปลั๊กอิน
- คัดลอกปลั๊กอินไปยังโฟลเดอร์ปลั๊กอินของโปรเจ็กต์
- เปิดใช้ปลั๊กอิน ADPF Unreal Engine ในโปรแกรมแก้ไข Unreal
- เปิดตัวเครื่องมือแก้ไข Unreal อีกครั้ง
- สร้างและคอมไพล์เกม
ปลั๊กอินเฟรมเวิร์กประสิทธิภาพไดนามิก Android(ADPF) สำหรับ Unreal Engine ช่วยให้ ประสิทธิภาพคงที่และป้องกันการควบคุมความร้อน ดาวน์โหลดปลั๊กอิน จาก GitHub ปลั๊กอินนี้จะเปลี่ยนฟีเจอร์โดยการตั้งค่าค่าคอนโซล Unreal