ฉันกำลังทำงานกับเกมพีซีที่มีไทล์ / สไปรต์กับทีมงานของผู้คนและเรากำลังประสบกับปัญหาด้านประสิทธิภาพ ครั้งสุดท้ายที่ฉันใช้ OpenGL คือประมาณปี 2004 ดังนั้นฉันจึงสอนตัวเองถึงการใช้โปรไฟล์หลักและฉันรู้สึกสับสนเล็กน้อย
ฉันต้องวาดในบริเวณใกล้เคียงของกระเบื้อง 250-750 48x48 ไปที่หน้าจอทุกเฟรมรวมทั้งอาจจะประมาณ 50 สไปรต์ ไทล์เปลี่ยนเฉพาะเมื่อโหลดระดับใหม่และสไปรต์กำลังเปลี่ยนแปลงอยู่ตลอดเวลา กระเบื้องบางชิ้นประกอบไปด้วยชิ้นส่วน 24x24 สี่ชิ้นและส่วนใหญ่ (แต่ไม่ทั้งหมด) ของสไปรต์มีขนาดเท่ากับกระเบื้อง กระเบื้องและสไปรท์จำนวนมากใช้การผสมอัลฟา
ตอนนี้ฉันกำลังทำทั้งหมดนี้ในโหมดเร่งด่วนซึ่งฉันรู้ว่าเป็นความคิดที่ไม่ดี เหมือนกันเมื่อสมาชิกในทีมของเราพยายามเรียกใช้เขาจะได้รับอัตราเฟรมที่ไม่ดีมาก (~ 20-30 fps) และมันแย่กว่ามากเมื่อมีไทล์มากขึ้นโดยเฉพาะอย่างยิ่งเมื่อไทล์เหล่านั้นเป็นแบบนั้น ถูกตัดเป็นชิ้น ๆ ทั้งหมดนี้ทำให้ฉันคิดว่าปัญหาคือจำนวนการเรียกสายที่กำลังทำอยู่
ฉันคิดถึงวิธีแก้ปัญหาที่เป็นไปได้สองสามอย่างนี้ แต่ฉันต้องการเรียกใช้พวกเขาโดยบางคนที่รู้ว่าพวกเขากำลังพูดถึงอะไรฉันจึงไม่เสียเวลากับเรื่องโง่ ๆ :
กระเบื้อง:
- เมื่อมีการโหลดเลเวลให้วาดไทล์ทั้งหมดลงในบัฟเฟอร์เฟรมที่แนบกับพื้นผิวที่มีขนาดใหญ่และเพียงแค่วาดสี่เหลี่ยมขนาดใหญ่ที่มีพื้นผิวนั้นติดอยู่ทุกเฟรม
- ใส่กระเบื้องทั้งหมดลงในบัฟเฟอร์จุดสุดยอดแบบคงที่เมื่อโหลดระดับและวาดพวกเขาในแบบนั้น ฉันไม่รู้ว่ามีวิธีการวาดวัตถุที่มีพื้นผิวแตกต่างกันด้วยการเรียกใช้ glDrawElements เพียงครั้งเดียวหรือไม่หรือถ้านี่คือสิ่งที่ฉันต้องการจะทำ อาจจะแค่ใส่กระเบื้องทั้งหมดลงในพื้นผิวยักษ์ใหญ่และใช้พิกัดพื้นผิวตลกใน VBO
sprites:
- วาดเทพดาแต่ละอันด้วยการเรียกแยกต่างหากไปยัง glDrawElements ดูเหมือนว่าจะเกี่ยวข้องกับการสลับพื้นผิวมากมายซึ่งฉันบอกว่าไม่ดี อาเรย์พื้นผิวอาจมีประโยชน์ที่นี่?
- ใช้ VBO แบบไดนามิกอย่างใด คำถามพื้นผิวเช่นเดียวกับหมายเลข 2 ด้านบน
- ชี้สไปรต์? นี่อาจจะโง่
มีความคิดใด ๆ เหล่านี้สมเหตุสมผลหรือไม่ มีการนำไปปฏิบัติที่ดีที่ไหนสักแห่งที่ฉันสามารถดูได้หรือไม่?