ยังมีข้อดีที่จะใช้ gl_quads หรือไม่?


10

ตกลงฉันเข้าใจว่า gl_quads เลิกใช้แล้วดังนั้นเราไม่ควร 'ใช้' อีกต่อไป ฉันยังเข้าใจว่าพีซีที่ทันสมัยเมื่อเรียกใช้เกมโดยใช้ gl_quads วาดรูปสามเหลี่ยมสองรูปจริง ๆ

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

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

ถ้าฉันเปลี่ยนวัตถุบัฟเฟอร์ของฉันเพื่อวาดรูปสามเหลี่ยมจุดสุดยอดข้อมูลจุดนี้จะใหญ่กว่า 50% (จุดยอดหกจุดเพื่อวาดสี่เหลี่ยมจัตุรัสแทนที่จะเป็น 4) และใช้เวลาในการสร้าง CPU นานขึ้น 50%

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


5
ฉันแน่ใจว่า OpenGL สนับสนุนจุดสุดยอดบัฟเฟอร์แบบดัชนีบางประเภทซึ่งหมายความว่าคุณเก็บเฉพาะจุดยอด 4 จุดเดียวกันสำหรับรูปสี่เหลี่ยมและแทนที่จะทำจุดยอดทั้งหมดซ้ำเพื่อสร้างสามเหลี่ยมสองรูปคุณทำซ้ำดัชนีเท่านั้น: [0,1,2] , [2,3,0]


ฉันเชื่อว่าข้อมูลจำเพาะ GL ยังคงกำหนดเงื่อนไขบางกรณีที่การวาดเป็นรูปสี่เหลี่ยมมีความสำคัญเช่นกับ glPolygonMode (... , GL_LINE)
Maximus Minimus

คำตอบ:


5

ทดสอบเกมจริงของคุณ ถ้าล่ามเร็วขึ้นให้ใช้มัน ถ้าไม่ทำไม่ได้

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

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


3

ทางเลือกคืออะไร? ทางเลือกหนึ่งคือใช้Geometry Shadersผ่านGL_LINES_ADJACENCYแบบดั้งเดิม (4 จุดยอด) และให้ GS แปลงแบบดั้งเดิมนี้เป็นแถบสามเหลี่ยม อย่างไรก็ตามนั่นจะช้ากว่าในการเรนเดอร์เพราะเราควรถือว่าเฉดสีเรขาคณิตนั้นช้ากว่าเสมอในการเรนเดอร์

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

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


การเปรียบเทียบล่าสุดที่ฉันทำแสดงให้เห็นว่า glMultiDrawArrays เป็นหนทางที่รวดเร็วสำหรับทั้ง NV และ AMD (ไม่ได้รบกวน Intel) ดังนั้นจึงมีตัวเลือกอื่น - glMultiDrawArrays พร้อมพัดลมหรือแถบ
Maximus Minimus

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