AGI Frame Profiler ช่วยให้คุณตรวจสอบ Shader ได้โดย เลือก Draw Call จาก Render Pass รายการใดรายการหนึ่งของเรา แล้วไปที่ส่วนVertex Shader หรือส่วนFragment Shader ของแผงไปป์ไลน์
ในส่วนนี้ คุณจะเห็นสถิติที่เป็นประโยชน์ซึ่งมาจากการวิเคราะห์แบบคงที่ของโค้ดเชเดอร์ รวมถึงแอสเซมบลี Standard Portable Intermediate Representation (SPIR-V) ที่ GLSL ของเราคอมไพล์ลงไป นอกจากนี้ยังมีแท็บ สำหรับดูการแสดง GLSL ต้นฉบับ (พร้อมชื่อที่คอมไพเลอร์สร้างขึ้นสำหรับตัวแปร ฟังก์ชัน และอื่นๆ) ที่คอมไพล์ย้อนกลับด้วย SPIR-V Cross เพื่อให้บริบทเพิ่มเติมสำหรับ SPIR-V
การวิเคราะห์แบบคงที่

ใช้ตัวนับการวิเคราะห์แบบคงที่เพื่อดูการดำเนินการระดับต่ำใน Shader
คำสั่ง ALU: จำนวนนี้แสดงจำนวนการดำเนินการ ALU (การบวก การคูณ การหาร และอื่นๆ) ที่ดำเนินการภายใน Shader และเป็นตัวแทนที่ดีสำหรับความซับซ้อนของ Shader พยายามลด ค่านี้
การปรับโครงสร้างการคำนวณทั่วไปหรือการลดความซับซ้อนของการคำนวณที่ทำใน Shader จะช่วยลดจำนวนคำสั่งที่จำเป็นได้
คำสั่งเกี่ยวกับเท็กซ์เจอร์: จำนวนนี้แสดงจำนวนครั้งที่การสุ่มตัวอย่างเท็กซ์เจอร์ เกิดขึ้นใน Shader
- การสุ่มตัวอย่างเท็กซ์เจอร์อาจมีค่าใช้จ่ายสูง ทั้งนี้ขึ้นอยู่กับประเภทของเท็กซ์เจอร์ ที่สุ่มตัวอย่าง ดังนั้นการอ้างอิงโค้ดเชเดอร์กับเท็กซ์เจอร์ที่ผูกไว้ ซึ่งอยู่ในส่วนชุดตัวอธิบายจะให้ข้อมูลเพิ่มเติมเกี่ยวกับ ประเภทของเท็กซ์เจอร์ที่ใช้
- หลีกเลี่ยงการเข้าถึงแบบสุ่มเมื่อสุ่มตัวอย่างเท็กซ์เจอร์ เนื่องจากลักษณะการทำงานนี้ไม่เหมาะกับการแคชเท็กซ์เจอร์
คำสั่งสาขา: จำนวนนี้แสดงจำนวนการดำเนินการสาขา ใน Shader การลดการแยกสาขาเหมาะอย่างยิ่งสำหรับโปรเซสเซอร์แบบขนาน เช่น GPU และยังช่วยให้คอมไพเลอร์ค้นหาการเพิ่มประสิทธิภาพเพิ่มเติมได้ด้วย
- ใช้ฟังก์ชัน เช่น
min
,max
และclamp
เพื่อหลีกเลี่ยงการ แยกสาขาตามค่าตัวเลข - ทดสอบต้นทุนการคำนวณเมื่อมีการแยกสาขา เนื่องจากเส้นทางทั้ง 2 เส้นทางของ กิ่งก้านจะดำเนินการในสถาปัตยกรรมจำนวนมาก จึงมีหลายสถานการณ์ ที่การคำนวณเสมอจะเร็วกว่าการข้าม การคำนวณด้วยกิ่งก้าน
- ใช้ฟังก์ชัน เช่น
รีจิสเตอร์ชั่วคราว: รีจิสเตอร์เหล่านี้เป็นรีจิสเตอร์ที่รวดเร็วและอยู่บนแกนประมวลผล ซึ่งใช้เพื่อ จัดเก็บผลลัพธ์ของการดำเนินการขั้นกลางที่จำเป็นสำหรับการคำนวณใน GPU จำนวนรีจิสเตอร์ที่ใช้ได้สำหรับการคำนวณมีจำกัด ก่อนที่ GPU จะต้องใช้หน่วยความจำนอกคอร์อื่นๆ เพื่อจัดเก็บ ค่ากลาง ซึ่งจะลดประสิทธิภาพโดยรวม (ขีดจำกัดนี้จะแตกต่างกันไป ตามรุ่นของ GPU)
จำนวนรีจิสเตอร์ชั่วคราวที่ใช้จริงอาจสูงกว่าที่คาดไว้หากคอมไพเลอร์ Shader ดำเนินการต่างๆ เช่น การคลายลูป ดังนั้นจึงควรตรวจสอบค่านี้กับ SPIR-V หรือ GLSL ที่คอมไพล์แล้วเพื่อดูว่าโค้ดทำอะไรอยู่
การวิเคราะห์โค้ด Shader
ตรวจสอบโค้ด Shader ที่คอมไพล์ย้อนกลับเพื่อดูว่า สามารถปรับปรุงได้หรือไม่

- ความแม่นยำ: ความแม่นยำของตัวแปร Shader อาจส่งผลต่อประสิทธิภาพ GPU ของแอปพลิเคชัน
- ลองใช้
mediump
ตัวแก้ไขความแม่นยำกับตัวแปรทุกที่ที่ทำได้ เนื่องจากตัวแปรความแม่นยำปานกลาง (mediump
) 16 บิตมักจะเร็วกว่าและประหยัดพลังงานมากกว่าตัวแปรความแม่นยำเต็ม (highp
) 32 บิต - หากไม่เห็นตัวระบุความแม่นยำใน Shader ในการประกาศตัวแปร
หรือที่ด้านบนของ Shader ที่มี
precision precision-qualifier type
ระบบจะตั้งค่าเริ่มต้นเป็นความแม่นยำเต็ม (highp
) อย่าลืมดูการประกาศตัวแปรด้วย - นอกจากนี้ เรายังแนะนำให้ใช้
mediump
สำหรับเอาต์พุต Vertex Shader ด้วยเหตุผลเดียวกันกับที่อธิบายไว้ข้างต้น และยังช่วยลดแบนด์วิดท์ของหน่วยความจำและอาจลดการใช้รีจิสเตอร์ชั่วคราวที่จำเป็นต่อการทำอินเทอร์โพเลชันได้ด้วย
- ลองใช้
- Uniform Buffers: พยายามทำให้ขนาดของ Uniform Buffers เล็กที่สุดเท่าที่จะเป็นไปได้ (โดยยังคงรักษากฎการจัดแนวไว้) ซึ่งช่วยให้การคำนวณ เข้ากันได้กับการแคชมากขึ้น และอาจช่วยให้ระบบสามารถ เลื่อนระดับข้อมูลที่สม่ำเสมอไปยังรีจิสเตอร์ในคอร์ที่เร็วกว่าได้
นำเอาต์พุต Vertex Shader ที่ไม่ได้ใช้ออก: หากพบว่า Fragment Shader ไม่ได้ใช้เอาต์พุต Vertex Shader ให้นำเอาต์พุตเหล่านั้นออกจาก Shader เพื่อเพิ่มแบนด์วิดท์ของหน่วยความจำและรีจิสเตอร์ชั่วคราว
ย้ายการคำนวณจาก Fragment Shader ไปยัง Vertex Shader: หากโค้ด Fragment Shader ทำการคำนวณที่ไม่ขึ้นอยู่กับสถานะที่เฉพาะเจาะจงกับ Fragment ที่กำลังแรเงา (หรือสามารถประมาณค่าได้อย่างเหมาะสม) การย้ายไปยัง Vertex Shader จะเป็นตัวเลือกที่เหมาะสม สาเหตุคือในแอปส่วนใหญ่ Vertex Shader จะทำงานน้อยกว่า Fragment Shader มาก