ตรวจสอบความเร็วในการแสดงผลของ GPU และการแสดงพิกเซลซ้ำ

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

ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกสำหรับนักพัฒนาแอปในอุปกรณ์ รวมถึงวิธีเปิดใช้ได้ที่กำหนดค่าตัวเลือกสำหรับนักพัฒนาแอปในอุปกรณ์

ความเร็วในการแสดงผล GPU ตามโปรไฟล์

เครื่องมือการแสดงผล GPU ตามโปรไฟล์จะแสดงการแสดงผลด้วยภาพเป็นฮิสโทแกรมแบบเลื่อน ซึ่งแสดงระยะเวลาที่ใช้ในการแสดงผลเฟรมของหน้าต่าง UI เมื่อเทียบกับเกณฑ์มาตรฐานที่ 16.67 มิลลิวินาทีต่อเฟรม

ใน GPU ที่มีประสิทธิภาพน้อยกว่า อัตราการส่งโฆษณาที่ใช้ได้ (ความเร็วที่ GPU สามารถเติม เฟรมบัฟเฟอร์) อาจต่ำมาก เมื่อจำนวนพิกเซลที่ต้องใช้ในการวาดเฟรมเพิ่มขึ้น GPU อาจใช้เวลาประมวลผลคำสั่งใหม่นานขึ้น ซึ่งจะทำให้ส่วนอื่นๆ ของระบบต้องรอจนกว่า GPU จะประมวลผลได้ทัน

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

เปิดใช้โปรไฟล์เลอร์

ก่อนที่จะเริ่ม ให้ตรวจสอบว่าคุณใช้อุปกรณ์ที่ใช้ Android 4.1 (API ระดับ 16) ขึ้นไป และเปิดใช้ตัวเลือกสำหรับนักพัฒนาแอป หากต้องการเริ่มการสร้างโปรไฟล์การแสดงผล GPU ของอุปกรณ์ขณะใช้แอป ให้ทำดังนี้

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

ตรวจสอบเอาต์พุต

ในรูปภาพที่ขยายของกราฟการแสดงผล GPU ของโปรไฟล์ที่แสดงในรูปที่ 1 คุณจะเห็นส่วนที่มีสีตามที่แสดงใน Android 6.0 (API ระดับ 23)

รูปที่ 1 กราฟการแสดงผล GPU ของโปรไฟล์ที่ขยาย

ต่อไปนี้คือข้อควรทราบเกี่ยวกับเอาต์พุต

  • เครื่องมือจะแสดงกราฟสำหรับแต่ละแอปพลิเคชันที่มองเห็นได้
  • แถบแนวตั้งแต่ละแถบตามแกนนอนแสดงเฟรม และความสูงของแถบแนวตั้งแต่ละแถบแสดงระยะเวลาที่เฟรมใช้ในการแสดงผล (เป็นมิลลิวินาที)
  • เส้นสีเขียวแนวนอนแสดงถึง 16.67 มิลลิวินาที หากต้องการให้ได้ 60 เฟรมต่อวินาที แถบแนวตั้งของแต่ละเฟรมต้อง อยู่ใต้เส้นนี้ เมื่อใดก็ตามที่แท่งเกินเส้นนี้ อาจมีการหยุดชั่วคราวใน ภาพเคลื่อนไหว
  • เครื่องมือจะไฮไลต์เฟรมที่เกินเกณฑ์ 16.67 มิลลิวินาทีโดย ทำให้แถบที่เกี่ยวข้องกว้างขึ้นและโปร่งใสน้อยลง
  • แต่ละแท่งมีคอมโพเนนต์สีที่แมปกับขั้นตอนในไปป์ไลน์การแสดงผล จำนวนคอมโพเนนต์จะแตกต่างกันไปตามระดับ API ของ อุปกรณ์

ตารางต่อไปนี้อธิบายแต่ละส่วนของแถบแนวตั้งในเอาต์พุตของโปรไฟล์เลอร์เมื่อใช้อุปกรณ์ที่ใช้ Android 6.0 ขึ้นไป

ส่วนประกอบของแถบขั้นตอนการแสดงผลคำอธิบาย
Swap Buffers แสดงเวลาที่ CPU รอให้ GPU ทำงานเสร็จ หาก แถบนี้สูงขึ้น แสดงว่าแอปทำงานบน GPU มากเกินไป
ปัญหาเกี่ยวกับคำสั่ง แสดงเวลาที่ตัวแสดงผล 2 มิติของ Android ใช้ในการออกคำสั่งไปยัง OpenGL เพื่อวาดและ วาดรายการแสดงผลซ้ำ ความสูงของแถบนี้แปรผันโดยตรงกับผลรวมของเวลาที่ใช้ในการดำเนินการแต่ละรายการในรายการที่แสดง ยิ่งมีรายการที่แสดงมากเท่าใด แถบสีแดงก็จะยิ่งสูงขึ้น
ซิงค์และอัปโหลด แสดงเวลาที่ใช้ในการอัปโหลดข้อมูลบิตแมปลงใน GPU ส่วนขนาดใหญ่ แสดงว่าแอปใช้เวลานานพอสมควรในการโหลดกราฟิกจำนวนมาก
วาด แสดงเวลาที่ใช้ในการสร้างและอัปเดตรายการที่แสดงของข้อมูลพร็อพเพอร์ตี้ หากส่วนนี้ของ แถบสูง แสดงว่าอาจมีการวาดวิวที่กำหนดเองจำนวนมาก หรือมีงานจำนวนมากในเมธอด onDraw
วัด / วาง แสดงระยะเวลาที่ใช้ใน onLayout และ onMeasure ใน ลำดับชั้นของมุมมอง กลุ่มขนาดใหญ่บ่งบอกว่าลำดับชั้นของมุมมองใช้เวลานาน ในการประมวลผล
การจัดการอินพุตและภาพเคลื่อนไหว แสดงระยะเวลาที่ใช้ในการประเมินภาพเคลื่อนไหวทั้งหมดที่ ทำงานสำหรับเฟรมนั้น และจัดการการเรียกกลับของอินพุตทั้งหมด หากส่วนนี้มีขนาดใหญ่ อาจบ่งชี้ว่าแอนิเมเตอร์ที่กำหนดเองหรือการเรียกกลับของอินพุตใช้เวลาในการประมวลผลมากเกินไป การเชื่อมโยงมุมมองขณะเลื่อน เช่น RecyclerView.Adapter.onBindViewHolder() มักเกิดขึ้นในช่วงนี้เช่นกัน และเป็นแหล่งที่มาที่พบบ่อยกว่า ของการชะลอตัวในส่วนนี้
เวลาอื่นๆ / ความล่าช้าของ VSync แสดงเวลาที่แอปใช้ในการดำเนินการระหว่างเฟรม 2 เฟรมติดต่อกัน ซึ่งอาจเป็นตัวบ่งชี้ว่ามีการประมวลผลมากเกินไปในเทรด UI ซึ่ง อาจส่งไปยังเทรดอื่นได้

ตารางที่ 1 แถบส่วนประกอบใน Android 6.0 ขึ้นไป

Android เวอร์ชันระหว่าง 4.0 (API ระดับ 14) ถึง 5.0 (API ระดับ 21) มีส่วนสีน้ำเงิน ม่วง แดง และส้ม Android เวอร์ชันต่ำกว่า 4.0 จะมีเฉพาะคอมโพเนนต์สีน้ำเงิน สีแดง และสีส้ม ตารางต่อไปนี้แสดงแถบส่วนประกอบใน Android 4.0 และ 5.0

ส่วนประกอบของแถบขั้นตอนการแสดงผลคำอธิบาย
กระบวนการ แสดงเวลาที่ CPU รอให้ GPU ทำงานเสร็จ หากแถบนี้ สูงขึ้น แสดงว่าแอปทำงานบน GPU มากเกินไป
ดำเนินการ แสดงเวลาที่ตัวแสดงผล 2 มิติของ Android ใช้ในการออกคำสั่งไปยัง OpenGL เพื่อวาดและ วาดรายการแสดงผลซ้ำ ความสูงของแถบนี้แปรผันโดยตรงกับผลรวมของเวลาที่ใช้ในการดำเนินการแต่ละรายการในรายการที่แสดง ยิ่งมีรายการที่แสดงมากเท่าใด แถบสีแดงก็จะยิ่งสูงขึ้น
XFer แสดงเวลาที่ใช้ในการอัปโหลดข้อมูลบิตแมปลงใน GPU ส่วนขนาดใหญ่ แสดงว่าแอปใช้เวลานานพอสมควรในการโหลดกราฟิกจำนวนมาก กลุ่มนี้จะไม่ปรากฏในอุปกรณ์ที่ใช้ Android 4.0 หรือต่ำกว่า
อัปเดต แสดงเวลาที่ใช้ในการสร้างและอัปเดตรายการที่แสดงของข้อมูลพร็อพเพอร์ตี้ หากส่วนนี้ของ แถบสูง แสดงว่าอาจมีการวาดวิวที่กำหนดเองจำนวนมาก หรือมีงานจำนวนมากในเมธอด onDraw

ตารางที่ 2 แถบส่วนประกอบใน Android 4.0 และ 5.0

ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีตีความข้อมูลที่เครื่องมือสร้างโปรไฟล์ให้ไว้ได้ที่การวิเคราะห์ด้วยการแสดงผล GPU ของโปรไฟล์

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

แสดงภาพการแสดงพิกเซลซ้ำด้วย GPU

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

หากยังไม่ได้ดำเนินการ ให้เปิดใช้ตัวเลือกสำหรับนักพัฒนาแอป จากนั้นหากต้องการแสดงภาพการวาดทับในอุปกรณ์ ให้ทำดังนี้

  1. ไปที่การตั้งค่าในอุปกรณ์ แล้วแตะ ตัวเลือกสำหรับนักพัฒนาแอป
  2. เลื่อนลงไปที่ส่วนการแสดงผลที่เร่งด้วยฮาร์ดแวร์ แล้วเลือกแก้ไขข้อบกพร่องการวาดทับของ GPU
  3. ในกล่องโต้ตอบแก้ไขข้อบกพร่องการแสดงพิกเซลซ้ำด้วย GPU ให้เลือก แสดงพื้นที่การแสดงพิกเซลซ้ำ

Android จะระบายสีองค์ประกอบ UI เพื่อระบุจำนวนการวาดทับ ดังนี้

  • สีจริง: ไม่มีการวาดทับ
  • สีน้ำเงิน: เบิกเกินบัญชี 1 ครั้ง
  • สีเขียว: เบิกเกินบัญชี 2 ครั้ง
  • สีชมพู: ถอนเงินเกินบัญชี 3 ครั้ง
  • สีแดง: ถอนเงินเกินบัญชี 4 ครั้งขึ้นไป

รูปที่ 2 แอปที่ปรากฏตามปกติ (ซ้าย) และ แอปที่ปรากฏเมื่อเปิดใช้การแสดงพิกเซลซ้ำด้วย GPU (ขวา)

โปรดทราบว่าสีเหล่านี้มีความโปร่งแสงบางส่วน ดังนั้นสีที่แน่นอน ที่คุณเห็นบนหน้าจอจะขึ้นอยู่กับเนื้อหาของ UI

เมื่อทราบแล้วว่าเลย์เอาต์ส่วนใดที่เกิดการวาดทับ โปรดอ่านวิธีลด การวาดทับ

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

รูปที่ 3 ตัวอย่างแอปที่มีการวาดทับจำนวนมาก (ซ้าย) และการวาดทับที่น้อยกว่ามาก (ขวา)