วิธีรับบล็อกที่ผู้เล่นมองเห็นได้อย่างไร


15

ฉันกำลังเขียนเกมที่เหมือน Minecraft โดยใช้ Ogre engine และฉันมีปัญหา ฉันต้องเพิ่มประสิทธิภาพเกมของฉันเพราะเมื่อฉันพยายามวาด 10,000 บล็อกฉันมี 2 FPS ... ดังนั้นฉันจึงมีความคิดที่บล็อคแสดงเครื่องบินและซ่อนบล็อกที่มองไม่เห็น แต่ฉันมีปัญหา - ฉันจะรู้ได้อย่างไรว่าผู้เล่นคนใดสามารถมองเห็นบล็อคใดบ้าง?

และ - หากคุณรู้จักวิธีการปรับให้เหมาะสมอื่น ๆ สำหรับเกมดังกล่าวให้เขียนว่าจะใช้อะไรใน Ogre

คำตอบ:


16

ตอนนี้ Ogre ได้ทำการเลือกสรร frustum culling (ซึ่งโดยทั่วไปแล้วไม่ได้วาดอะไรที่ไม่สามารถมองเห็นได้จากกล้อง) แต่ฉันคิดว่าปัญหาของคุณนั้นแตกต่างออกไป

คุณไม่ควรแสดง 10,000 บล็อกจริง ๆ แล้วสิ่งที่ทำกันทั่วไป (หรืออย่างน้อยก็ใน minecraft ที่ใช้ Ogre3d เหมือนโคลนที่ฉันเคยเห็น (ซึ่งฉันกำลังทำอยู่) ของบางพื้นที่ของ NxNxN) ซึ่งมีใบหน้าด้านนอกของคิวบ์แสดงอยู่ นั่นคือเมื่อคุณวาง 2 คิวบ์เคียงข้างไม่สามารถมองเห็นใบหน้าทั้งสองได้ดังนั้นจึงไม่จำเป็นต้องวาด

ใบหน้าเหล่านี้ควรวาดในลักษณะเช่นนี้: http://www.ogre3d.org/tikiwiki/tiki-index.php?page=DynamicGrowingBuffersเนื่องจากการ์ดแสดงผลแบบสมัยใหม่ต้องการตาข่ายหนึ่งหมื่นโพลีตันและ 1,000 ตาข่าย 100 โพลิกอน


10

ปัญหานี้มีสองด้าน ประการแรกคุณวาดบล็อก 10,000 บล็อกของคุณอย่างไร? คุณวาดพวกมันเป็นวัตถุที่แยกกัน 10,000 จริงหรือ ถ้าเป็นเช่นนั้นนี่คือคอขวดของคุณแน่นอนไม่ใช่การขาดการบดเคี้ยว คุณควรจัดกลุ่มบล็อกเหล่านี้เป็นจำนวนตาข่ายที่น้อยลง (อาจจะไม่กี่พันตัวต่อหนึ่งเครือข่าย) เพื่อลดการเรียกสาย

สำหรับคำถามที่แท้จริงของคุณมีการกำจัดการบดเคี้ยวสามประเภท

1) บล็อกนอกมุมมอง frustum นี่หมายถึงบล็อกที่อยู่ด้านหลังคุณหรือสองข้าง Ogre ลบสิ่งเหล่านี้ผ่านการดูการคัดออกแล้ว

2) บล็อกที่เป็น 'ใต้ดิน' หรือล้อมรอบอย่างสมบูรณ์ด้วยบล็อกอื่น ๆ เพื่อให้พวกเขาไม่สามารถมองเห็นได้จากทุกมุม คุณสามารถระบุสิ่งเหล่านี้ได้โดยดูที่บล็อกที่อยู่ใกล้เคียงขนาด หากพวกเขาทั้งหมดแข็งบล็อกของคุณถูกซ่อนอยู่ GPU ไม่ควรแม้แต่จะได้ยินเกี่ยวกับบล็อคเหล่านี้ - มันควรถูกข้ามไปเมื่อคุณสร้างตาข่ายซึ่งแสดงถึงพื้นผิวของคุณ

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

มันเป็นสิ่งที่ไร้ยางอาย แต่ฉันมีห้องสมุดที่ค่อนข้างเป็นผู้ใหญ่ซึ่งหลายคนกำลังใช้ในการพัฒนาโคลน Minecraft รวมถึงบางคนที่ใช้ Ogre คุณกำหนดเนื้อหาของปริมาณและสร้างพื้นผิวตาข่ายซึ่งคุณสามารถแสดงผล นี่คือหน้าแรก:

http://www.thermite3d.org/

และนี่คือวิดีโอโครงการของคนอื่นที่ใช้งานอยู่:

http://www.youtube.com/watch?v=Jju6WRPEK7o


4

คุณสามารถใช้ backface culling เพื่อคัดจุดยอดและพิกเซลที่เกี่ยวข้องที่ไม่พบกับผู้เล่น บัฟเฟอร์ความลึกควรดูแลส่วนที่เหลือ บล็อก 10k มีจำนวนไม่มากนัก 5770 ของฉันสามารถแสดงผล 100k ที่ 1500fps ฉันคิดว่าคุณกำลังทำอะไรผิดพลาด


ฉันเห็นด้วย. นี่เป็นปัญหาที่เกิดขึ้นกับสิ่งอื่นใด
Notabene

1

หากคุณมีวัตถุ 10,000 ชิ้นแยกกันคอขวดน่าจะเป็นจำนวนดั้งเดิมไม่ใช่จุดยอดรูปหลายเหลี่ยมหรือเติม อบวัตถุของคุณให้มีขนาดเล็กลงเพื่อเพิ่มความเร็วให้กับวัตถุรูปหลายเหลี่ยม

Minecraft มีแนวคิดของบล็อกของลูกบาศก์ แต่ฉันไม่สามารถหาข้อมูลอ้างอิงได้ในขณะนี้

นี่คือการทดลองของฉันเกี่ยวกับการวาดลูกบาศก์จำนวนมากด้วยเทคนิคต่าง ๆ ไม่รวมการอบ (ยัง)


0

สิ่งที่ฉันทำคือหลังจากที่ฉันสร้างอาร์เรย์ของบล็อก แต่ก่อนที่ฉันจะสร้างจุดยอดฉันเรียกใช้ย่อยชื่อ UpdateBlockVisiblility

ย่อยจะตรวจสอบเพื่อนบ้านไปยังบล็อกและอัปเดตบูลีนที่มองเห็นได้ของบล็อกตามนั้น

#define BLOCKFACE_NORTH 0

#define BLOCKFACE_SOUTH 1 

etc etc etc

if(IsBlockAt(NorthOfBlock))
  Blocks[Whatever].facevisible[BLOCKFACE_NORTH] = false;

จากนั้นฉันก็สร้างจุดยอดสำหรับใบหน้าหากมองเห็นได้! ง่าย ๆ :)

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