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 แต่ละรายการได้ ดังที่แสดงด้านล่าง
ดูข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีลดอาการกระตุกได้ที่แหล่งที่มาทั่วไปของอาการกระตุก