เซสชันที่ช้าคือเซสชันที่มีเฟรมช้ามากกว่า 25% เฟรมที่แสดงผลช้าคือเฟรมที่แสดงผลนานกว่า 50 มิลลิวินาทีหลังจากเฟรมก่อนหน้า (เทียบเท่ากับ 20 FPS) Android Vitals ยังรายงานเมตริกเซสชันที่ช้าที่ 2 โดยมีเป้าหมายที่ 34 มิลลิวินาที (เทียบเท่ากับ 30 FPS) คุณสามารถใช้ข้อมูลเซสชันที่ช้า เพื่อทำความเข้าใจประสิทธิภาพอัตราเฟรมของเกมซึ่งส่งผลต่อความลื่นไหลของเกมสำหรับผู้ใช้
Play จะเริ่มพาผู้ใช้ออกจากเกมที่มีอัตราเฟรม 20 FPS ในโทรศัพท์ให้ทันเวลา โปรดทราบว่า Android vitals จะเริ่มตรวจสอบอัตราเฟรมหลังจากที่เกมทำงานไปแล้ว 1 นาทีเท่านั้น
ดูรายละเอียดเพิ่มเติมเกี่ยวกับเมตริกได้ที่ศูนย์ช่วยเหลือ
วิธีวัด FPS และตรวจหาเฟรมที่ช้า
คำสั่ง dumpsys surfaceflinger timestats ของ Android จะแสดงฮิสโทแกรมเวลา present to present และ FPS เฉลี่ยสำหรับเลเยอร์ทั้งหมดที่กำลังแสดงผล เวลา present to present ของเฟรมคือช่วงเวลาระหว่างเฟรมปัจจุบันกับเฟรมก่อนหน้าซึ่งกำลังวาด ต่อไปนี้เป็นขั้นตอนการใช้คำสั่งเพื่อรวบรวม FPS ของเกม
เรียกใช้คำสั่งด้วยแฟล็ก
enableและclearเพื่อเริ่มบันทึกข้อมูลadb shell dumpsys SurfaceFlinger --timestats -clear -enableเมื่อเล่นเกมเป็นเวลานานพอแล้ว ให้เรียกใช้คำสั่งอีกครั้งโดยใช้แฟล็ก
dumpเพื่อดัมพ์ข้อมูลadb shell dumpsys SurfaceFlinger --timestats -dumpข้อมูลที่ส่งออกจะแสดงฮิสโทแกรมของเฟรมทั้งหมดและฮิสโทแกรม presentToPresent สำหรับ เลเยอร์ทั้งหมดที่ SurfaceFlinger แสดงผล คุณต้องค้นหาส่วนของเกมโดยการกรองตาม
layerNameดังนี้layerName = 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 ในโปรเจ็กต์ดั้งเดิม
ดูคำแนะนำต่อไปนี้เพื่อผสานรวมไลบรารี Frame Pacing ของ Android เข้ากับเกม
- ผสานรวม Android Frame Pacing เข้ากับโปรแกรมแสดงผล OpenGL
- ผสานรวมการเว้นวรรคเฟรมของ Android เข้ากับโปรแกรมแสดงผล Vulkan
วิธีใช้ Swappy ในเกมเอนจิน Unity
Unity ได้ผสานรวมการเว้นวรรคเฟรมของ Android เข้ากับเอนจินของตน หากต้องการเปิดใช้ฟีเจอร์นี้ใน Unity 2019.2 ขึ้นไป ให้เลือกช่องทำเครื่องหมายการเว้นวรรคเฟรมที่เพิ่มประสิทธิภาพในส่วนการตั้งค่าโปรเจ็กต์ > เครื่องเล่น > การตั้งค่าสำหรับ Android > ความละเอียดและการนำเสนอ
หรือจะเปิดใช้ตัวเลือกการเว้นระยะเฟรมที่เพิ่มประสิทธิภาพในโค้ดตรรกะแบบเป็นโปรแกรมก็ได้ เพื่อให้ Unity กระจายเฟรมอย่างสม่ำเสมอเพื่อลดความแปรปรวนของอัตราเฟรม ซึ่งจะช่วยให้การเล่นเกมราบรื่นขึ้น
วิธีใช้ Swappy ในเกมเอนจิน Unreal
Unreal 4.25 ขึ้นไปผสานรวมไลบรารีการเว้นเฟรมของ Android ซึ่งเป็นส่วนหนึ่งของ 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 APIs หากคุณใช้ 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: ตรวจสอบสถานะความร้อนของอุปกรณ์เพื่อให้แอปพลิเคชันปรับปริมาณงานได้ล่วงหน้าก่อนที่จะไม่สามารถจัดการได้
- API คำแนะนำด้านประสิทธิภาพของ CPU: ให้คำแนะนำด้านประสิทธิภาพที่ช่วยให้ 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 Editor อีกครั้ง
- สร้างและคอมไพล์เกม
ปลั๊กอินเฟรมเวิร์กประสิทธิภาพไดนามิก Android(ADPF) สำหรับ Unreal Engine ช่วยให้ ประสิทธิภาพคงที่และป้องกันการควบคุมความร้อน ดาวน์โหลดปลั๊กอิน จาก GitHub ปลั๊กอินนี้จะเปลี่ยนฟีเจอร์โดยการตั้งค่าค่าคอนโซล Unreal