ระบุการส่งผ่านการแสดงผลที่มีค่าใช้จ่ายสูงที่สุด

AGI Frame Profiler ช่วยให้คุณตรวจสอบการส่งผ่านการแสดงผลแต่ละรายการที่ใช้ในการคอมโพสเฟรมเดียวของแอปได้ โดยจะทำเช่นนี้ด้วยการสกัดกั้นและบันทึกสถานะทั้งหมดที่จำเป็นสำหรับการเรียกใช้ Graphics API แต่ละรายการ ใน Vulkan จะดำเนินการนี้โดยใช้ระบบเลเยอร์ของ Vulkan โดยตรง ใน OpenGL ระบบจะสกัดกั้นคำสั่งโดยใช้ ANGLE ซึ่งจะแปลงคำสั่ง OpenGL เป็นการเรียก Vulkan เพื่อให้ดำเนินการในฮาร์ดแวร์ได้

อุปกรณ์ Adreno

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

มุมมองไทม์ไลน์เฟรม
รูปที่ 1 มุมมองไทม์ไลน์ของเฟรม

เกณฑ์แรกที่คุณใช้ตรวจสอบ Render Pass ได้คือระยะเวลาที่ใช้ Render Pass ที่ใช้เวลานานที่สุดมักจะเป็น Render Pass ที่มีศักยภาพในการปรับปรุงมากที่สุด ดังนั้นให้เริ่มดูที่ Render Pass นั้น

การระบุการแสดงผลที่ยาวที่สุดในมุมมองไทม์ไลน์ของเฟรม
รูปที่ 2 การระบุการแสดงผลที่ใช้เวลานานที่สุดในมุมมองไทม์ไลน์ของเฟรม

Slice ของ GPU ที่เกี่ยวข้องกับ Render Pass ที่เกี่ยวข้องจะมีข้อมูลบางอย่างเกี่ยวกับสิ่งที่เกิดขึ้นภายใน Render Pass อยู่แล้ว

  1. การจัดกลุ่ม: การวางจุดยอดลงในกลุ่มตามตำแหน่งที่จุดยอดอยู่บนหน้าจอ
  2. การแสดงผล: ตำแหน่งที่พิกเซลหรือเศษส่วนได้รับการแรเงา
  3. การโหลด/จัดเก็บ GMEM: เมื่อมีการโหลดหรือจัดเก็บเนื้อหาของเฟรมบัฟเฟอร์จากหน่วยความจำ GPU ภายในไปยังหน่วยความจำหลัก

คุณสามารถดูคร่าวๆ ว่าอาจมีคอขวดตรงไหนได้โดยดูว่าแต่ละขั้นตอนใช้เวลานานเท่าใดภายใน Render Pass เช่น

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

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

การระบุการโหลดและการจัดเก็บ GMEM
รูปที่ 3 การระบุการโหลดและการจัดเก็บ GMEM

การตรวจสอบการส่งผ่านการแสดงผลขนาดใหญ่

หากต้องการดูคำสั่งวาดแต่ละรายการทั้งหมดที่ออกระหว่างการส่งผ่านการแสดงผล ให้ทำดังนี้

  1. คลิก Render Pass ในไทม์ไลน์ ซึ่งจะเปิดการแสดงผลในลำดับชั้นที่อยู่ในแผงคำสั่งของโปรไฟล์เฟรม

  2. คลิกเมนูของ Render Pass ซึ่งจะแสดงคำสั่งวาดแต่ละรายการทั้งหมดที่ออกในระหว่าง Render Pass หากเป็นแอปพลิเคชัน OpenGL คุณสามารถเจาะลึกยิ่งขึ้นและดูคำสั่ง Vulkan ที่ ANGLE ออกได้

แผงคำสั่ง
รูปที่ 4 แผงคำสั่ง

เลือก Draw Call รายการใดรายการหนึ่ง ซึ่งจะเปิดแผง Framebuffer ซึ่งแสดงการแนบ framebuffer ทั้งหมดที่ผูกไว้ระหว่างการวาดนี้ และผลลัพธ์สุดท้ายของการวาดใน framebuffer ที่แนบ นอกจากนี้ คุณยังใช้ AGI เพื่อเปิดทั้งการเรียกใช้การวาดก่อนหน้าและถัดไป รวมถึงเปรียบเทียบความแตกต่างระหว่าง 2 รายการนี้ได้ด้วย หากภาพเกือบจะเหมือนกันทุกประการ แสดงว่ามีโอกาสที่จะขจัดคำสั่งวาดที่ไม่ส่งผลต่อรูปภาพสุดท้าย

การเลือกการเรียกใช้การวาดแต่ละรายการในแผงคำสั่ง
รูปที่ 5 การเลือกการเรียกวาดแต่ละรายการในแผงคำสั่ง

การเปิดแผงไปป์ไลน์สำหรับการวาดนี้จะแสดงสถานะที่ไปป์ไลน์กราฟิกใช้เพื่อเรียกใช้การเรียกวาดนี้

แผงไปป์ไลน์
รูปที่ 6 แผงไปป์ไลน์

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

ส่วน Input Assembler ในแผงไปป์ไลน์
รูปที่ 7 ส่วน Input Assembler ในแผงไปป์ไลน์

ส่วนVertex Shader จะให้ข้อมูลเกี่ยวกับ Vertex Shader ที่คุณใช้ในระหว่างการวาดนี้ และยังเป็นจุดที่เหมาะสำหรับการตรวจสอบหากพบว่าการจัดกลุ่มเป็นปัญหา คุณสามารถดู SPIR-V และ GLSL ที่คอมไพล์แล้วของ Shader ที่ใช้ และตรวจสอบ Uniform Buffer ที่เชื่อมโยงสำหรับการเรียกนี้ ดูรายละเอียดเพิ่มเติมได้ที่วิเคราะห์ประสิทธิภาพของ Shader

ส่วน Vertex Shader ในบานหน้าต่างไปป์ไลน์
รูปที่ 8 ส่วน Vertex Shader ในแผงไปป์ไลน์

ส่วนRasterizer จะแสดงข้อมูลเกี่ยวกับการตั้งค่าไปป์ไลน์แบบฟังก์ชันคงที่ มากขึ้น และใช้เพื่อวัตถุประสงค์ในการแก้ไขข้อบกพร่องของ สถานะฟังก์ชันคงที่ เช่น Viewport, Scissor, สถานะความลึก และโหมดรูปหลายเหลี่ยม ได้มากขึ้น

ส่วน Rasterizer ในบานหน้าต่างไปป์ไลน์
รูปที่ 9 ส่วน Rasterizer ในแผงไปป์ไลน์

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

ส่วน Fragment Shader ในแผงไปป์ไลน์
รูปที่ 10 ส่วน Fragment Shader ในแผงไปป์ไลน์

การตรวจสอบการส่งผ่านการแสดงผลขนาดเล็ก

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

การแสดงผลแบบหลายพาสขนาดเล็กที่ใช้ในการดาวน์แซมเปิลบัฟเฟอร์ความละเอียดดั้งเดิม
รูปที่ 11 การส่งผ่านการแสดงผลขนาดเล็กที่ใช้ในการดาวน์แซมเปิลบัฟเฟอร์ความละเอียดดั้งเดิม