ฉันกำลังเขียนโคลนของ Minecraft เอง (เขียนด้วยภาษาจาวา) มันใช้งานได้ดีในขณะนี้ ด้วยระยะการดู 40 เมตรฉันสามารถกด 60 FPS บน MacBook Pro 8,1 ได้อย่างง่ายดาย (Intel i5 + Intel HD Graphics 3000) แต่ถ้าฉันวางระยะทางในการมองที่ 70 เมตรฉันจะไปถึง 15-25 FPS ใน Minecraft ตัวจริงฉันสามารถใส่ความไม่ลงรอยกันในการมองไกล (= 256m) ได้โดยไม่มีปัญหา ดังนั้นคำถามของฉันคือฉันควรทำอย่างไรเพื่อทำให้เกมของฉันดีขึ้น?
การเพิ่มประสิทธิภาพที่ฉันใช้:
- เก็บเฉพาะชิ้นส่วนในหน่วยความจำเท่านั้น (ขึ้นอยู่กับระยะการมองของผู้เล่น)
- Frustum culling (ครั้งแรกบนชิ้นแล้วบนบล็อก)
- วาดเฉพาะใบหน้าที่มองเห็นได้จริงๆของบล็อกเท่านั้น
- ใช้รายการต่ออันที่มีบล็อกที่มองเห็นได้ ส่วนที่มองเห็นได้จะเพิ่มเข้าไปในรายการนี้ หากพวกเขากลายเป็นล่องหนพวกเขาจะถูกลบออกจากรายการนี้โดยอัตโนมัติ บล็อกกลายเป็น (ใน) มองเห็นได้โดยการสร้างหรือทำลายบล็อกเพื่อนบ้าน
- การใช้รายการต่ออันประกอบด้วยบล็อกการปรับปรุง กลไกเดียวกับรายการบล็อกที่มองเห็นได้
- ใช้
new
คำสั่งแทบไม่มีในลูปเกม (เกมของฉันทำงานประมาณ 20 วินาทีจนกระทั่งตัวรวบรวมข้อมูลขยะถูกเรียกใช้) - ฉันใช้รายการโทร OpenGL ในขณะนี้ (
glNewList()
,glEndList()
,glCallList()
) สำหรับแต่ละด้านของชนิดของบล็อก
ปัจจุบันฉันยังไม่ได้ใช้ระบบไฟส่องสว่างชนิดใด ฉันได้ยินเกี่ยวกับ VBO แล้ว แต่ฉันไม่รู้ว่ามันคืออะไร อย่างไรก็ตามฉันจะทำวิจัยเกี่ยวกับพวกเขา พวกเขาจะปรับปรุงประสิทธิภาพหรือไม่ ก่อนที่จะใช้ VBO ฉันต้องการลองใช้glCallLists()
และผ่านรายการโทร glCallList()
แทนการใช้พันครั้ง (ฉันต้องการลองสิ่งนี้เพราะฉันคิดว่า MineCraft จริงไม่ได้ใช้ VBO ถูกต้องใช่ไหม)
มีเทคนิคอื่น ๆ เพื่อปรับปรุงประสิทธิภาพหรือไม่?
การทำโปรไฟล์ VisualVM แสดงให้ฉันเห็น (การทำโปรไฟล์สำหรับ 33 เฟรมเท่านั้นด้วยระยะการดู 70 เมตร):
การทำโปรไฟล์ 40 เมตร (246 เฟรม):
หมายเหตุ:ฉันกำลังซิงโครไนซ์หลายวิธีและการบล็อกรหัสเพราะฉันกำลังสร้างชิ้นในเธรดอื่น ฉันคิดว่าการได้รับการล็อกสำหรับวัตถุเป็นปัญหาด้านประสิทธิภาพเมื่อทำสิ่งนี้ในเกมลูป (แน่นอนฉันกำลังพูดถึงเวลาที่มีเพียงลูปเกมเท่านั้นและไม่มีชิ้นส่วนใหม่ถูกสร้างขึ้น) ถูกต้องหรือไม่
แก้ไข:หลังจากลบบางsynchronised
บล็อกและการปรับปรุงเล็กน้อยอื่น ๆ ประสิทธิภาพนั้นดีขึ้นมากแล้ว นี่คือผลลัพธ์การรวบรวมสถานะใหม่ของฉันที่มี 70 เมตร:
ฉันคิดว่ามันค่อนข้างชัดเจนว่าselectVisibleBlocks
เป็นปัญหาที่นี่
ขอบคุณล่วงหน้า!
Martijn
อัปเดต : หลังจากการปรับปรุงพิเศษบางอย่าง (เช่นการใช้ลูปแทนแต่ละตัวการกำหนดบัฟเฟอร์ตัวแปรภายนอกลูป ฯลฯ ... ) ตอนนี้ฉันสามารถเรียกใช้ระยะการดู 60 ได้ค่อนข้างดี
ฉันคิดว่าฉันจะใช้ VBO โดยเร็วที่สุด
PS: ซอร์สโค้ดทั้งหมดมีอยู่ใน GitHub:
https://github.com/mcourteaux/CraftMania