การตรวจหาความหน่วงของ UI

Android แสดงผล UI โดยการสร้างเฟรมจากแอปและแสดงบน หน้าจอ หากแอปแสดงผล UI ช้า ระบบจะ บังคับให้ข้ามเฟรม เมื่อเกิดเหตุการณ์นี้ ผู้ใช้จะเห็นภาพกะพริบซ้ำๆ บนหน้าจอ ซึ่งเรียกว่าความหน่วง

โดยปกติแล้ว เมื่อเกิดการกระตุก มักเป็นเพราะการชะลอความเร็วหรือการบล็อกการเรียกแบบอะซิงโครนัส ในเทรด UI (ในแอปส่วนใหญ่จะเป็นเทรดหลัก) คุณใช้การติดตามระบบ เพื่อระบุตำแหน่งที่เกิดปัญหาได้

ตรวจหาความกระตุกใน Android 12 ขึ้นไป

สำหรับอุปกรณ์ที่ใช้ Android 12 (API ระดับ 31) ขึ้นไป ระบบจะแสดงการติดตามที่บันทึกไว้ในแทร็กเฟรมกระตุกใต้แผงจอแสดงผลใน CPU Profiler

หากต้องการตรวจหาการกระตุก ให้ทำดังนี้

  1. ใน Android Studio ให้เลือกมุมมอง > หน้าต่างเครื่องมือ > โปรไฟล์เลอร์ หรือคลิกโปรไฟล์ ในแถบเครื่องมือ

    หากได้รับแจ้งจากกล่องโต้ตอบเลือกเป้าหมายการติดตั้งใช้งาน ให้เลือกอุปกรณ์ที่จะติดตั้งใช้งานแอปเพื่อทำการโปรไฟล์ หากคุณเชื่อมต่ออุปกรณ์ผ่าน USB แต่ไม่เห็นอุปกรณ์ในรายการ ให้ตรวจสอบว่าคุณได้เปิดใช้การแก้ไขข้อบกพร่อง USB แล้ว

  2. คลิกที่ใดก็ได้ในไทม์ไลน์ CPU เพื่อเปิด CPU Profiler

  3. เลือกการติดตามระบบจากเมนูการกำหนดค่าใน CPU Profiler แล้ว คลิกบันทึก หลังจากโต้ตอบกับแอปเสร็จแล้ว ให้คลิกหยุด

  4. คุณควรเห็นแทร็กเฟรมที่กระตุกในส่วนแสดง โดยค่าเริ่มต้น Profiler จะแสดงเฉพาะเฟรมที่กระตุกเป็นรายการที่ควรตรวจสอบ ภายในเฟรมที่กระตุกแต่ละเฟรม ส่วนสีแดงจะไฮไลต์ระยะเวลาที่เฟรมใช้เกิน กำหนดเวลาการแสดงผล ภาพหน้าจอของแทร็กเฟรมที่กระตุก

  5. เมื่อพบเฟรมที่กระตุก ให้คลิกเฟรมนั้น หรือจะกด M เพื่อ ปรับการซูมเพื่อโฟกัสที่เฟรมที่เลือกก็ได้ เหตุการณ์ที่เกี่ยวข้องจะไฮไลต์ในเทรดเหล่านี้ ได้แก่ เทรดหลัก RenderThread และการทำงานของ GPU เสร็จสมบูรณ์ ภาพหน้าจอของ Profiler ที่แสดงเฟรมที่กระตุกและเธรดหลัก

  6. คุณเลือกดูเฟรมทั้งหมดหรือรายละเอียดเวลาในการแสดงผลได้โดย สลับช่องทําเครื่องหมายเฟรมทั้งหมดและวงจรตามลําดับ ภาพหน้าจอของ Profiler ตามที่แสดงด้านบน แต่มีการเลือกช่องทำเครื่องหมายเฟรมทั้งหมดและวงจร

ตรวจหาความหน่วงใน Android 11

สำหรับอุปกรณ์ที่ใช้ Android 11 (API ระดับ 30) ระบบจะแสดงการติดตามที่บันทึกไว้ในส่วนวงจรของเฟรมใน CPU Profiler

ส่วนวงจรเฟรมที่มีแทร็กต่างๆ

ส่วนวงจรเฟรมประกอบด้วยชื่อเลเยอร์และ 4 แทร็ก โดยแต่ละแทร็กจะแสดงถึงขั้นตอนหนึ่งในไปป์ไลน์การแสดงผลเฟรม องค์ประกอบ Frame Lifecycle มีดังนี้

  1. วงจรเฟรม (ชื่อเลเยอร์): ชื่อส่วนมีชื่อเลเยอร์ ในวงเล็บ เลเยอร์คือหน่วยเดียวของการเรียบเรียง
  2. แอปพลิเคชัน: แทร็กนี้แสดงเวลาตั้งแต่ตอนที่แอปนำบัฟเฟอร์ออกจากคิว จนถึงตอนที่ใส่บัฟเฟอร์กลับเข้าไปในคิว ซึ่งโดยปกติจะสอดคล้องกับเหตุการณ์การติดตามใน RenderThread
  3. รอ GPU: แทร็กนี้แสดงระยะเวลาที่ GPU เป็นเจ้าของบัฟเฟอร์ ซึ่งเป็นระยะเวลานับจากเวลาที่ส่งบัฟเฟอร์ไปยัง GPU จนถึงเวลาที่ GPU ทำงานกับบัฟเฟอร์เสร็จ ไม่ได้หมายความว่า GPU ทำงานเฉพาะในบัฟเฟอร์นี้ในช่วงเวลานี้ หากต้องการดูข้อมูลโดยละเอียดเกี่ยวกับสิ่งที่ GPU ทำ ในช่วงเวลาหนึ่งๆ คุณอาจต้องใช้ Android GPU Inspector
  4. การคอมโพสิต: แทร็กนี้แสดงเวลาตั้งแต่ตอนที่ SurfaceFlinger ล็อกบัฟเฟอร์และส่งบัฟเฟอร์สำหรับการคอมโพสิต ไปจนถึงตอนที่ส่งบัฟเฟอร์ ไปยังจอแสดงผล
  5. เฟรมที่แสดง: แทร็กนี้แสดงระยะเวลาที่เฟรมอยู่บนหน้าจอ

ส่วนวงจรเฟรมจะแสดงให้เห็นว่าบัฟเฟอร์เฟรมเคลื่อนที่ระหว่าง ขั้นตอนต่างๆ ของไปป์ไลน์การแสดงผลอย่างไร เฟรมจะมีรหัสสีตามหมายเลขเฟรม เพื่อให้ติดตามเฟรมที่ต้องการได้ง่ายขึ้น

Android Studio ยังแสดงเฟรมทั้งหมดในการติดตามในรูปแบบตารางในแท็บเฟรมทั้งหมดด้วย

ตารางของเฟรมทั้งหมดในการติดตามในแท็บ "เฟรมทั้งหมด"

คอลัมน์เฟรม #, แอปพลิเคชัน, รอ GPU และการคอมโพสิตแสดงข้อมูลเดียวกันกับแทร็กในส่วนวงจรของเฟรมตามที่ระบุไว้ข้างต้น คอลัมน์ระยะเวลาของเฟรมแสดงเวลา ตั้งแต่เริ่มต้นแอปพลิเคชันจนถึงเริ่มต้นเฟรมที่แสดง ซึ่งเป็นระยะเวลาที่ใช้ในการแสดงผลเฟรมตั้งแต่ต้นจนจบ

คุณสามารถจัดเรียงตารางเฟรมตามคอลัมน์ใดก็ได้เพื่อค้นหาเฟรมที่สั้นที่สุดหรือ ยาวที่สุดได้อย่างรวดเร็ว ตารางยังรองรับตัวควบคุมการแบ่งหน้า ซึ่งช่วยให้คุณไปยังส่วนต่างๆ ของเฟรมหลายร้อยเฟรมได้

หากต้องการตรวจหาและตรวจสอบอาการกระตุกใน Android 11 ให้ทำตามขั้นตอนต่อไปนี้

  1. จัดเรียงตารางเฟรมทั้งหมดตามคอลัมน์แอปพลิเคชันจากมากไปน้อย เพื่อให้เฟรมที่ใช้เวลานานที่สุดปรากฏก่อน

    คอลัมน์แอปพลิเคชันจัดเรียงจากมากไปน้อย

  2. ค้นหาเฟรมที่ทำงานนานที่สุด แล้วเลือกแถวในตาราง ซึ่งจะซูมเข้าที่เฟรมที่เลือกในมุมมองไทม์ไลน์ทางด้านซ้าย

    มุมมองไทม์ไลน์ข้างตารางเฟรม

  3. มองหาเธรดที่เกี่ยวข้องในส่วนวงจรของ Frame และเธรด

    ส่วนวงจรของเฟรมและเธรด

ตรวจหาความหน่วงใน Android 10 และต่ำกว่า

สำหรับอุปกรณ์ที่ใช้ Android 10 (API ระดับ 29) และต่ำกว่า ข้อมูลไปป์ไลน์กราฟิกของระบบปฏิบัติการที่เกี่ยวข้อง จะแสดงในส่วนเดียวในแทร็กระบบของ CPU Profiler ที่ชื่อว่าจอแสดงผล

หน้าต่าง UI ของจอแสดงผล

  • เฟรม: ส่วนนี้แสดงเธรด 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 หรือต่ำกว่า ให้ทำตามขั้นตอนต่อไปนี้

  1. ดูแทร็กเฟรมในจอแสดงผล เฟรมสีแดงคือเฟรมที่ ควรตรวจสอบ

    ส่วนเฟรมในส่วนจอแสดงผล

  2. เมื่อพบเฟรมที่อาจไม่ราบรื่น ให้ซูมเข้าโดยกด W หรือ เลื่อนล้อเมาส์ขณะกด Control (Command ใน macOS) ซูมเข้าไปเรื่อยๆ จนกว่าจะเริ่มเห็น เหตุการณ์การติดตามในเทรด UI และ RenderThread

    ติดตามเหตุการณ์ในเธรด UI และ RenderThread

    ในรูปด้านบน Choreographer#doFrame จะแสดงเมื่อเธรด UI เรียกใช้ Choreographer เพื่อประสานงาน ภาพเคลื่อนไหว เลย์เอาต์ของมุมมอง การวาดรูปภาพ และกระบวนการที่เกี่ยวข้อง DrawFrames จะแสดงเมื่อ RenderThread สร้างและส่งคำสั่งวาดจริงไปยัง GPU

  3. หากเห็นเหตุการณ์การติดตามที่ยาวเป็นพิเศษ คุณสามารถซูมเข้าเพิ่มเติมและดูว่า อะไรอาจเป็นสาเหตุที่ทำให้การแสดงผลช้า รูปด้านบนแสดง inflate ในเทรด UI ซึ่งหมายความว่าแอปใช้เวลาในการขยายเลย์เอาต์ เมื่อซูมเข้าไปในinflateเหตุการณ์ใดเหตุการณ์หนึ่ง คุณจะดูระยะเวลาที่แน่นอนของ คอมโพเนนต์ UI แต่ละรายการได้ ดังที่แสดงด้านล่าง

    เมนูที่แสดงระยะเวลาที่แน่นอนของคอมโพเนนต์ UI

ดูข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีลดอาการกระตุกได้ที่แหล่งที่มาทั่วไปของอาการกระตุก