วิธีที่มีประสิทธิภาพที่สุดในการจัดระเบียบข้อมูลจุดสุดยอดของ GPU สมัยใหม่


9

บอกว่าผมมีรูปแบบที่สร้างขึ้นจากจุดแต่ละคนมีposition, normal, tangentและtexcoordแอตทริบิวต์ที่สามเหลี่ยมถูกกำหนดโดยดัชนีอเนกประสงค์

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

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

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


4
คุณลองใช้งานดูไหมว่ากรณีไหนที่เร็วที่สุดสำหรับคุณ?
user1118321

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

ขึ้นอยู่กับประเภทของข้อมูลในโครงสร้าง vec4s และแพลทฟอร์มที่รวมเข้าด้วยกันเป็นอย่างดีชนิดอื่น ๆ ก็ไม่ค่อยจะดีเท่านี้
PaulHK

2
@ user1118321 ในขณะที่การทดสอบการเปรียบเทียบเป็นแบบฝึกหัดที่น่าชื่นชม แต่ก็มีคุณค่าในระยะยาวมากกว่าในการอภิปรายเชิงทฤษฎีที่กว้างขึ้นและอาจส่งผลให้เกิดการสร้างแนวปฏิบัติทั่วไปขึ้นอยู่กับวิธีการดึงจุดสุดยอดของฮาร์ดแวร์
Christian Rau

คำตอบ:


2

ขอโทษฉันจะเพิ่มความคิดเห็นในหัวข้อคำถามของคุณ แต่พบว่าฉันจบลงอย่างประณีตมากเกินไป ประสบการณ์การพัฒนาของฉันมาจากมุมมองของ DX 11 ดังนั้นสิ่งนี้อาจไม่ได้อยู่ใน OpenGL

ตำแหน่งหน่วยความจำของข้อมูลนั้นมีบทบาทสำคัญอย่างแน่นอน แต่มีบางรายการที่เล่นในเรื่องนี้ความกว้างของข้อมูลตามที่คุณรู้ ฉันมี GPU สองสามตัวและมีการแสดงที่ยอดเยี่ยมโดยขึ้นอยู่กับจุดเปลี่ยนบางอย่าง นั่นคือตัวอย่างบน AMD r290 รุ่นเก่าของฉันถ้าฉันจำได้ว่าโดยทั่วไปคุณสามารถส่งได้ถึง 4 float4s ผ่านไปยังจุดสุดยอดบัฟเฟอร์โดยไม่มีค่าใช้จ่ายเพิ่มเติมมากกว่า 1 แต่เมื่อฉันโพสต์> 4 แล้วมีการวัดที่ลดลง ประเมินค่า). นี่คือความทรงจำของฉันอย่างหมดจดและเป็นเรื่องที่ดีที่สุด แต่มันถือได้ว่าสถาปัตยกรรม GPU นั้นเปลี่ยนแปลงอยู่ตลอดเวลาและเทคนิคเฉพาะใดที่ทำให้คุณได้เปรียบในการทำงานในวันนี้ ผม'

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

ทั้งหมดที่ฉันสามารถพูดโดยสรุปจากตัวเองคือ:

  • พยายามอย่าคิดเรื่องการเพิ่มประสิทธิภาพในตอนเริ่มต้นในขณะที่คุณยังคงพัฒนาเกม / แอพพลิเคชั่นพยายามอย่าปรับให้เหมาะสมก่อนเวลาอันควร หากคุณต้องการกลับมาและเพิ่มความสามารถใหม่ ๆ คุณอาจต้องใช้ความพยายามทั้งหมด คุณอาจมีนิสัยของฉัน>> รักที่จะพยายามให้ได้ประสิทธิภาพและเทคนิคที่ดีที่สุด
  • สถาปัตยกรรมของ GPU นั้นมีความหลากหลายและจุดแข็งของหนึ่งสามารถสะท้อนถึงจุดอ่อนได้ AMD และ Nvidia มีชื่อเสียงในการพัฒนาเกมให้เหมาะกับสถาปัตยกรรมของพวกเขาด้วยเหตุผลแต่ละข้อมีข้อดี / ข้อเสีย การใช้ถนนสายกลางในการพัฒนาอาจเป็นสถานที่ที่ดีที่สุดอย่าใช้คุณสมบัติของผู้จำหน่ายฮาร์ดแวร์ใด ๆ (ความคิดเห็นที่นี่) (เพิ่มลงในรูปแบบที่บรรจุไว้บางอย่างเท่านั้นที่มีอยู่ใน AMD)

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


1

สิ่งนี้อาจขึ้นอยู่กับฮาร์ดแวร์เป้าหมายและ API ที่คุณจะใช้ คุณสามารถให้ข้อมูลเพิ่มเติมได้หรือไม่ ต่อไปนี้เป็นแนวทางปฏิบัติที่ดีที่สุดบางส่วน (ทั่วไปและกว้างมาก) สำหรับ OpenGL https://www.khronos.org/opengl/wiki/Vertex_Specification_Best_Practices

นอกจากนี้คุณมีปัญหาด้านประสิทธิภาพหรือไม่ หรือคุณแค่อยากรู้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.