Android มีตัวเลือกสำหรับนักพัฒนาแอปในอุปกรณ์บางอย่างที่จะช่วยให้คุณเห็นภาพ ตำแหน่งที่แอปอาจพบปัญหาในการแสดงผล UI เช่น การทำงาน การแสดงผลมากกว่าที่จำเป็น หรือการดำเนินการกับเธรดและ GPU เป็นเวลานาน หน้านี้อธิบายวิธีแก้ไขข้อบกพร่องการแสดงพิกเซลซ้ำด้วย GPU และการแสดงผล GPU ตามโปรไฟล์
ดูข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกสำหรับนักพัฒนาแอปในอุปกรณ์ รวมถึงวิธีเปิดใช้ได้ที่กำหนดค่าตัวเลือกสำหรับนักพัฒนาแอปในอุปกรณ์
ความเร็วในการแสดงผล GPU ตามโปรไฟล์
เครื่องมือการแสดงผล GPU ตามโปรไฟล์จะแสดงการแสดงผลด้วยภาพเป็นฮิสโทแกรมแบบเลื่อน ซึ่งแสดงระยะเวลาที่ใช้ในการแสดงผลเฟรมของหน้าต่าง UI เมื่อเทียบกับเกณฑ์มาตรฐานที่ 16.67 มิลลิวินาทีต่อเฟรม
ใน GPU ที่มีประสิทธิภาพน้อยกว่า อัตราการส่งโฆษณาที่ใช้ได้ (ความเร็วที่ GPU สามารถเติม เฟรมบัฟเฟอร์) อาจต่ำมาก เมื่อจำนวนพิกเซลที่ต้องใช้ในการวาดเฟรมเพิ่มขึ้น GPU อาจใช้เวลาประมวลผลคำสั่งใหม่นานขึ้น ซึ่งจะทำให้ส่วนอื่นๆ ของระบบต้องรอจนกว่า GPU จะประมวลผลได้ทัน
เครื่องมือสร้างโปรไฟล์ช่วยให้คุณระบุได้ว่าเมื่อใดที่ GPU ทำงานหนักเกินไปในการพยายาม วาดพิกเซล หรือทำงานหนักเนื่องจากมีการวาดทับมากเกินไป
เปิดใช้โปรไฟล์เลอร์
ก่อนที่จะเริ่ม ให้ตรวจสอบว่าคุณใช้อุปกรณ์ที่ใช้ Android 4.1 (API ระดับ 16) ขึ้นไป และเปิดใช้ตัวเลือกสำหรับนักพัฒนาแอป หากต้องการเริ่มการสร้างโปรไฟล์การแสดงผล GPU ของอุปกรณ์ขณะใช้แอป ให้ทำดังนี้
- ไปที่การตั้งค่าในอุปกรณ์ แล้วแตะตัวเลือกสำหรับนักพัฒนาแอป
- ในส่วนการตรวจสอบ ให้เลือกการแสดงผล GPU ของโปรไฟล์ หรือการแสดงผล HWUI ของโปรไฟล์ ขึ้นอยู่กับเวอร์ชันของ Android ที่ทำงานในอุปกรณ์
- ในกล่องโต้ตอบการแสดงผล GPU ของโปรไฟล์ ให้เลือกบนหน้าจอเป็นแถบเพื่อ วางซ้อนกราฟบนหน้าจอของอุปกรณ์
- เปิดแอปที่ต้องการสร้างโปรไฟล์
ตรวจสอบเอาต์พุต
ในรูปภาพที่ขยายของกราฟการแสดงผล 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 ต้องทำงานเพิ่มเติมเพื่อแสดงผลพิกเซลที่ผู้ใช้มองไม่เห็น ดังนั้น คุณควรแก้ไขเหตุการณ์การวาดทับ ทุกครั้งที่ทำได้
หากยังไม่ได้ดำเนินการ ให้เปิดใช้ตัวเลือกสำหรับนักพัฒนาแอป จากนั้นหากต้องการแสดงภาพการวาดทับในอุปกรณ์ ให้ทำดังนี้
- ไปที่การตั้งค่าในอุปกรณ์ แล้วแตะ ตัวเลือกสำหรับนักพัฒนาแอป
- เลื่อนลงไปที่ส่วนการแสดงผลที่เร่งด้วยฮาร์ดแวร์ แล้วเลือกแก้ไขข้อบกพร่องการวาดทับของ GPU
- ในกล่องโต้ตอบแก้ไขข้อบกพร่องการแสดงพิกเซลซ้ำด้วย GPU ให้เลือก แสดงพื้นที่การแสดงพิกเซลซ้ำ
Android จะระบายสีองค์ประกอบ UI เพื่อระบุจำนวนการวาดทับ ดังนี้
- สีจริง: ไม่มีการวาดทับ
สีน้ำเงิน: เบิกเกินบัญชี 1 ครั้ง
สีเขียว: เบิกเกินบัญชี 2 ครั้ง
สีชมพู: ถอนเงินเกินบัญชี 3 ครั้ง
สีแดง: ถอนเงินเกินบัญชี 4 ครั้งขึ้นไป
รูปที่ 2 แอปที่ปรากฏตามปกติ (ซ้าย) และ แอปที่ปรากฏเมื่อเปิดใช้การแสดงพิกเซลซ้ำด้วย GPU (ขวา)
โปรดทราบว่าสีเหล่านี้มีความโปร่งแสงบางส่วน ดังนั้นสีที่แน่นอน ที่คุณเห็นบนหน้าจอจะขึ้นอยู่กับเนื้อหาของ UI
เมื่อทราบแล้วว่าเลย์เอาต์ส่วนใดที่เกิดการวาดทับ โปรดอ่านวิธีลด การวาดทับ
โปรดทราบว่าการเบิกเกินบัญชีบางครั้งก็หลีกเลี่ยงไม่ได้ ขณะปรับแต่งอินเทอร์เฟซผู้ใช้ของแอป ให้พยายามสร้างภาพที่แสดงสีจริงเป็นส่วนใหญ่หรือมีการวาดทับเพียง 1 เท่า (สีน้ำเงิน)
รูปที่ 3 ตัวอย่างแอปที่มีการวาดทับจำนวนมาก (ซ้าย) และการวาดทับที่น้อยกว่ามาก (ขวา)