เคล็ดลับการเพิ่มประสิทธิภาพ OpenGL [ปิด]


26

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

คำตอบ:


16

ใช้ VBO แทน glStart () / glEnd () สิ่งนี้ช่วยประหยัดรอบในการถ่ายโอนข้อมูลไปยังหน่วยความจำของ GPU


7
ยิ่งไปกว่านั้น glBegin และ glEnd ถูกคัดค้านในการแก้ไขในภายหลังและถูกลบออกอย่างสมบูรณ์ (และดังนั้นจะไม่ทำงาน) ในเวอร์ชัน 3.x และสูงกว่า หากคุณร้องขอบริบท OpenGL 3.x คุณจะไม่สามารถใช้งานได้อย่างสมบูรณ์
Slurps Mad Rips

DirectX glStart()/glEnd()จริงกองกำลังนี้เมื่อคุณก็ไม่ได้มีความเท่าเทียมกันของ
knight666

@SAHChandler ฉันไม่รู้ ฉันไม่ได้ตระหนักว่ามันเลิกใช้แล้ว
MrValdez

3
@SAHChandler: นั่นแย่! ฉันเรียนรู้การวาดทั้งหมดด้วย glBegin () และ glEnd () noooo !!!

8

เคล็ดลับมาตรฐานของโปรไฟล์โปรไฟล์และโปรไฟล์ใช้งานได้เช่นกันที่นี่แม้ว่าเครื่องมือจะแตกต่างกันเล็กน้อย

gDEBuggerนั้นยอดเยี่ยมที่ช่วยให้คุณเห็นว่าเกิดอะไรขึ้นภายใต้ประทุน แม้ว่ามันจะมีราคาแพง


2
แค่อยากจะเพิ่มว่าตอนนี้มันฟรีแล้ว
DMan

8

สิ่งเหล่านี้มาจากเอกสารอ้างอิงของ Apple ใน OpenGL แต่ทุกอย่างช่วยได้ใช่มั้ย ;)

การเพิ่มประสิทธิภาพประสิทธิภาพ OpenGL: พื้นฐาน
การเพิ่มประสิทธิภาพการรับส่งข้อมูล OpenGL บน OS X

(อันสุดท้ายคือแอปพลิเคชันตัวอย่าง)
การเพิ่มประสิทธิภาพ Vertex

นอกจากนี้ยังมีวิดีโอจำนวนมากที่มีอยู่ในหัวข้อ (เช่นจาก Apple) ที่พูดถึงส่วนขยาย OpenGL บางตัวมีเฉพาะ OS X แต่มีบางตัวที่ได้รับการปรับให้กว้างขึ้นและอาจนำไปใช้กับ Windows และ Linux ได้

คุณสามารถค้นหาวิดีโอที่นี่ คุณต้องใช้ iTunes และบัญชี Apple เพื่อดูอย่างไรก็ตาม (แต่ฟรี!: D)


7

มันขึ้นอยู่กับสิ่งที่คุณวางแผนจะทำ แต่นี่คือพื้นฐาน:

  • CPU ของคุณมีค่ามากในขณะที่ GPU ของคุณเป็นสัตว์ร้าย ชดเชยมากที่สุดเท่าที่คุณสามารถทำได้กับ GPU ทุกวันนี้คุณสามารถทำได้ด้วยห้องสมุดที่ยอดเยี่ยมเช่น OpenCL, CUDA และ Thrust

  • ทำแสงของคุณใน Shader สิ่งนี้ไม่เพียง แต่จะช่วยรักษาสติของคุณเท่านั้น แต่ยังช่วยให้คุณทำสิ่งที่เจ๋ง ๆ อย่างตูนเดอร์และแสงไฟที่เลื่อนออกไป

  • อนุภาคดูด แม้เมื่อใช้ OpenGL point sprite


6

ลดการเปลี่ยนแปลงสถานะของคุณให้น้อยที่สุด บนแพลตฟอร์มจำนวนมากการเปลี่ยนสถานะแต่ละครั้งอาจทำให้ท่อส่ง จะดีกว่ามากในการรวมรายการที่คล้ายกันเข้าด้วยกันและเปลี่ยนสถานะหนึ่งครั้ง


4
glEnable(GL_CULL_FACES);

ง่าย ๆ หนึ่งซับที่ใช้หลังการเลือกสรรใบหน้า สิ่งนี้ยอดเยี่ยมสำหรับการลดจำนวนรูปหลายเหลี่ยม นอกจากนี้ให้ดูที่ Frustum / Occlusion culling เพื่อลดจำนวนโพลี

สิ่งที่ควรพิจารณาอีกประการหนึ่งคือ SIMD สำหรับเวกเตอร์และควอเทอร์นารีของคุณ (ส่วนใหญ่ใช้ในการหมุนกล้อง) หากคุณไม่ต้องการยุ่งกับ ASM ให้ลองใช้ libSIMD ซึ่งเป็นห้องสมุดที่ยอดเยี่ยมสำหรับจัดการ SIMD ใน C


4

อย่าใช้ glGet * เมื่อคุณสามารถเข้าถึงตัวแปรเฉพาะที่ได้เช่น:

  • อย่าสอบถามขนาดพื้นผิวจาก OpenGL เก็บไว้ในการโหลดในตัวแปร
  • อย่าค้นหาขนาดความกว้าง / จุดของบรรทัดจาก OpenGL เมื่อคุณสามารถเก็บการเปลี่ยนแปลงในแอปพลิเคชันของคุณ

การเรียกเหล่านี้ช้ามาก

ย้ายสิ่งที่ไม่ได้ใช้นอก glBegin - glEnd clause (ไม่ว่าจะเป็น glColor หรือ glNormal หรืออย่างอื่น) หากไม่มีการเปลี่ยนแปลงภายใน OpenGL เป็นเครื่องสถานะมันใช้ค่าสุดท้าย


3

คำสั่ง OpenGL ที่เล็กที่สุดคือกุญแจ ดังนั้นคุณจะต้องแบทช์คำสั่งการวาดทั้งหมด สำหรับเกม 2d เป็นความคิดที่ดีที่จะใช้ Altas Texture และวาด sprite ทั้งหมดที่แชร์พื้นผิวเดียวกันในคำสั่ง opengl


ระวัง. ชุดข้อมูลที่น้อยและใหญ่จะมีประโยชน์ แต่ขึ้นอยู่กับแพลตฟอร์มเป้าหมาย "ชุดใหญ่เกินไป" จะช่วยลดประสิทธิภาพ
Andreas

3

ชุดแบทช์แบทช์ !! (Ab) ใช้ GPU เพื่อแสดงผลมากที่สุดในการเรียกแต่ละครั้ง เกมส่วนใหญ่ถูก จำกัด ด้วยจำนวนการเปลี่ยนแปลงสถานะไม่มากตามจำนวนของรูปสามเหลี่ยม

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