Android แสดงผล UI โดยการสร้างเฟรมจากแอปและแสดงบน หน้าจอ หากแอปแสดงผล UI ช้า ระบบจะ บังคับให้ข้ามเฟรม เมื่อเกิดเหตุการณ์นี้ ผู้ใช้จะเห็นภาพกะพริบซ้ำๆ บนหน้าจอ ซึ่งเรียกว่าความหน่วง
โดยปกติแล้ว เมื่อเกิดการกระตุก มักเป็นเพราะการชะลอความเร็วหรือการบล็อกการเรียกแบบอะซิงโครนัส ในเทรด UI (ในแอปส่วนใหญ่จะเป็นเทรดหลัก) คุณใช้การติดตามระบบ เพื่อระบุตำแหน่งที่เกิดปัญหาได้
ตรวจหาความกระตุกใน Android 12 ขึ้นไป
สำหรับอุปกรณ์ที่ใช้ Android 12 (API ระดับ 31) ขึ้นไป ระบบจะแสดงการติดตามที่บันทึกไว้ในแทร็กเฟรมกระตุกใต้แผงจอแสดงผลใน CPU Profiler
หากต้องการตรวจหาการกระตุก ให้ทำดังนี้
ใน Android Studio ให้เลือกมุมมอง > หน้าต่างเครื่องมือ > โปรไฟล์เลอร์ หรือคลิกโปรไฟล์
ในแถบเครื่องมือ
หากได้รับแจ้งจากกล่องโต้ตอบเลือกเป้าหมายการติดตั้งใช้งาน ให้เลือกอุปกรณ์ที่จะติดตั้งใช้งานแอปเพื่อทำการโปรไฟล์ หากคุณเชื่อมต่ออุปกรณ์ผ่าน USB แต่ไม่เห็นอุปกรณ์ในรายการ ให้ตรวจสอบว่าคุณได้เปิดใช้การแก้ไขข้อบกพร่อง USB แล้ว
คลิกที่ใดก็ได้ในไทม์ไลน์ CPU เพื่อเปิด CPU Profiler
เลือกการติดตามระบบจากเมนูการกำหนดค่าใน CPU Profiler แล้ว คลิกบันทึก หลังจากโต้ตอบกับแอปเสร็จแล้ว ให้คลิกหยุด
คุณควรเห็นแทร็กเฟรมที่กระตุกในส่วนแสดง โดยค่าเริ่มต้น Profiler จะแสดงเฉพาะเฟรมที่กระตุกเป็นรายการที่ควรตรวจสอบ ภายในเฟรมที่กระตุกแต่ละเฟรม ส่วนสีแดงจะไฮไลต์ระยะเวลาที่เฟรมใช้เกิน กำหนดเวลาการแสดงผล
เมื่อพบเฟรมที่กระตุก ให้คลิกเฟรมนั้น หรือจะกด M เพื่อ ปรับการซูมเพื่อโฟกัสที่เฟรมที่เลือกก็ได้ เหตุการณ์ที่เกี่ยวข้องจะไฮไลต์ในเทรดเหล่านี้ ได้แก่ เทรดหลัก RenderThread และการทำงานของ GPU เสร็จสมบูรณ์
คุณเลือกดูเฟรมทั้งหมดหรือรายละเอียดเวลาในการแสดงผลได้โดย สลับช่องทําเครื่องหมายเฟรมทั้งหมดและวงจรตามลําดับ
ตรวจหาความหน่วงใน Android 11
สำหรับอุปกรณ์ที่ใช้ Android 11 (API ระดับ 30) ระบบจะแสดงการติดตามที่บันทึกไว้ในส่วนวงจรของเฟรมใน CPU Profiler
ส่วนวงจรเฟรมประกอบด้วยชื่อเลเยอร์และ 4 แทร็ก โดยแต่ละแทร็กจะแสดงถึงขั้นตอนหนึ่งในไปป์ไลน์การแสดงผลเฟรม องค์ประกอบ Frame Lifecycle มีดังนี้
- วงจรเฟรม (ชื่อเลเยอร์): ชื่อส่วนมีชื่อเลเยอร์ ในวงเล็บ เลเยอร์คือหน่วยเดียวของการเรียบเรียง
- แอปพลิเคชัน: แทร็กนี้แสดงเวลาตั้งแต่ตอนที่แอปนำบัฟเฟอร์ออกจากคิว
จนถึงตอนที่ใส่บัฟเฟอร์กลับเข้าไปในคิว ซึ่งโดยปกติจะสอดคล้องกับเหตุการณ์การติดตามใน
RenderThread
- รอ GPU: แทร็กนี้แสดงระยะเวลาที่ GPU เป็นเจ้าของบัฟเฟอร์ ซึ่งเป็นระยะเวลานับจากเวลาที่ส่งบัฟเฟอร์ไปยัง GPU จนถึงเวลาที่ GPU ทำงานกับบัฟเฟอร์เสร็จ ไม่ได้หมายความว่า GPU ทำงานเฉพาะในบัฟเฟอร์นี้ในช่วงเวลานี้ หากต้องการดูข้อมูลโดยละเอียดเกี่ยวกับสิ่งที่ GPU ทำ ในช่วงเวลาหนึ่งๆ คุณอาจต้องใช้ Android GPU Inspector
- การคอมโพสิต: แทร็กนี้แสดงเวลาตั้งแต่ตอนที่ SurfaceFlinger ล็อกบัฟเฟอร์และส่งบัฟเฟอร์สำหรับการคอมโพสิต ไปจนถึงตอนที่ส่งบัฟเฟอร์ ไปยังจอแสดงผล
- เฟรมที่แสดง: แทร็กนี้แสดงระยะเวลาที่เฟรมอยู่บนหน้าจอ
ส่วนวงจรเฟรมจะแสดงให้เห็นว่าบัฟเฟอร์เฟรมเคลื่อนที่ระหว่าง ขั้นตอนต่างๆ ของไปป์ไลน์การแสดงผลอย่างไร เฟรมจะมีรหัสสีตามหมายเลขเฟรม เพื่อให้ติดตามเฟรมที่ต้องการได้ง่ายขึ้น
Android Studio ยังแสดงเฟรมทั้งหมดในการติดตามในรูปแบบตารางในแท็บเฟรมทั้งหมดด้วย
คอลัมน์เฟรม #, แอปพลิเคชัน, รอ GPU และการคอมโพสิตแสดงข้อมูลเดียวกันกับแทร็กในส่วนวงจรของเฟรมตามที่ระบุไว้ข้างต้น คอลัมน์ระยะเวลาของเฟรมแสดงเวลา ตั้งแต่เริ่มต้นแอปพลิเคชันจนถึงเริ่มต้นเฟรมที่แสดง ซึ่งเป็นระยะเวลาที่ใช้ในการแสดงผลเฟรมตั้งแต่ต้นจนจบ
คุณสามารถจัดเรียงตารางเฟรมตามคอลัมน์ใดก็ได้เพื่อค้นหาเฟรมที่สั้นที่สุดหรือ ยาวที่สุดได้อย่างรวดเร็ว ตารางยังรองรับตัวควบคุมการแบ่งหน้า ซึ่งช่วยให้คุณไปยังส่วนต่างๆ ของเฟรมหลายร้อยเฟรมได้
หากต้องการตรวจหาและตรวจสอบอาการกระตุกใน Android 11 ให้ทำตามขั้นตอนต่อไปนี้
จัดเรียงตารางเฟรมทั้งหมดตามคอลัมน์แอปพลิเคชันจากมากไปน้อย เพื่อให้เฟรมที่ใช้เวลานานที่สุดปรากฏก่อน
ค้นหาเฟรมที่ทำงานนานที่สุด แล้วเลือกแถวในตาราง ซึ่งจะซูมเข้าที่เฟรมที่เลือกในมุมมองไทม์ไลน์ทางด้านซ้าย
มองหาเธรดที่เกี่ยวข้องในส่วนวงจรของ Frame และเธรด
ตรวจหาความหน่วงใน Android 10 และต่ำกว่า
สำหรับอุปกรณ์ที่ใช้ Android 10 (API ระดับ 29) และต่ำกว่า ข้อมูลไปป์ไลน์กราฟิกของระบบปฏิบัติการที่เกี่ยวข้อง จะแสดงในส่วนเดียวในแทร็กระบบของ CPU Profiler ที่ชื่อว่าจอแสดงผล
- เฟรม: ส่วนนี้แสดงเธรด UI และ
RenderThread
เหตุการณ์การติดตาม ในแอปของคุณ เหตุการณ์ที่นานกว่า 16 มิลลิวินาทีจะมีสีแดงเพื่อ ไฮไลต์เฟรมที่อาจกระตุกเนื่องจากเกินกำหนดเวลาในการแสดงผลที่ 60 เฟรมต่อวินาที (fps) - SurfaceFlinger: ส่วนนี้จะแสดงเมื่อ SurfaceFlinger ประมวลผล บัฟเฟอร์เฟรม SurfaceFlinger เป็นกระบวนการของระบบที่มีหน้าที่ ส่งบัฟเฟอร์ไปยังจอแสดงผล
- VSYNC: ส่วนนี้จะแสดง VSYNC ซึ่งเป็นสัญญาณที่ซิงค์ ไปป์ไลน์การแสดงผล แทร็กจะแสดงสัญญาณ VSYNC-app ซึ่งจะแสดงเมื่อ แอปของคุณเริ่มทำงานช้าเกินไป โดยปกติแล้ว ปัญหานี้เกิดขึ้นเนื่องจากเทรด UI ไม่ว่าง ซึ่งจะทำให้เกิดการกะพริบที่มองเห็นได้บนหน้าจอระหว่างภาพเคลื่อนไหว และเพิ่มเวลาในการตอบสนองของอินพุตจนกว่าภาพเคลื่อนไหวหรือการเลื่อนจะเสร็จสมบูรณ์ ซึ่งมีความสำคัญอย่างยิ่งต่อการดูจอแสดงผลที่มีอัตราการรีเฟรชสูง เนื่องจากอาจเกิดขึ้นบ่อยกว่า 60 ครั้งต่อวินาทีหรือในอัตราที่เปลี่ยนแปลงได้
- BufferQueue: ส่วนนี้แสดงจำนวนบัฟเฟอร์เฟรมที่อยู่ในคิวและ
รอให้ SurfaceFlinger ใช้ สำหรับแอปที่ติดตั้งใช้งานในอุปกรณ์ที่ใช้ Android 9 (API ระดับ 28) ขึ้นไป แทร็กนี้จะแสดงจำนวนบัฟเฟอร์ของ Surface ของแอป BufferQueue
(
0
,1
หรือ2
) BufferQueue จะช่วยให้คุณเข้าใจสถานะของบัฟเฟอร์รูปภาพขณะที่ย้ายไปมาระหว่างคอมโพเนนต์กราฟิกของ Android เช่น ค่า2
หมายความว่าขณะนี้แอปใช้การบัฟเฟอร์ 3 เท่า ซึ่งส่งผลให้เกิดความหน่วงของอินพุตเพิ่มเติม
ส่วนการแสดงผลจะให้สัญญาณที่เป็นประโยชน์ในการตรวจหาการกระตุกที่อาจเกิดขึ้น เช่น เมื่อเธรด UI หรือ RenderThread
ใช้เวลานานกว่า 16 มิลลิวินาที หากต้องการตรวจสอบรายละเอียดที่แน่นอนของสาเหตุที่ทำให้เกิดการกระตุก คุณสามารถตรวจสอบส่วนเธรด ซึ่งแสดงเธรดที่เกี่ยวข้องกับการแสดงผล UI
ในรูปภาพด้านบน ส่วนเธรดจะแสดงเธรด UI
(java.com.google.samples.apps.iosched
), RenderThread
และเธรด GPU completion
เธรดเหล่านี้เกี่ยวข้องกับการแสดงผล UI และอาจทำให้เกิด
อาการกระตุก
หากต้องการตรวจหาความกระตุกใน Android 10 หรือต่ำกว่า ให้ทำตามขั้นตอนต่อไปนี้
ดูแทร็กเฟรมในจอแสดงผล เฟรมสีแดงคือเฟรมที่ ควรตรวจสอบ
เมื่อพบเฟรมที่อาจไม่ราบรื่น ให้ซูมเข้าโดยกด
W
หรือ เลื่อนล้อเมาส์ขณะกด Control (Command ใน macOS) ซูมเข้าไปเรื่อยๆ จนกว่าจะเริ่มเห็น เหตุการณ์การติดตามในเทรด UI และRenderThread
ในรูปด้านบน
Choreographer#doFrame
จะแสดงเมื่อเธรด UI เรียกใช้Choreographer
เพื่อประสานงาน ภาพเคลื่อนไหว เลย์เอาต์ของมุมมอง การวาดรูปภาพ และกระบวนการที่เกี่ยวข้องDrawFrames
จะแสดงเมื่อRenderThread
สร้างและส่งคำสั่งวาดจริงไปยัง GPUหากเห็นเหตุการณ์การติดตามที่ยาวเป็นพิเศษ คุณสามารถซูมเข้าเพิ่มเติมและดูว่า อะไรอาจเป็นสาเหตุที่ทำให้การแสดงผลช้า รูปด้านบนแสดง
inflate
ในเทรด UI ซึ่งหมายความว่าแอปใช้เวลาในการขยายเลย์เอาต์ เมื่อซูมเข้าไปในinflate
เหตุการณ์ใดเหตุการณ์หนึ่ง คุณจะดูระยะเวลาที่แน่นอนของ คอมโพเนนต์ UI แต่ละรายการได้ ดังที่แสดงด้านล่าง
ดูข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีลดอาการกระตุกได้ที่แหล่งที่มาทั่วไปของอาการกระตุก