คำถามติดแท็ก recursion

4
ฉันจะนำแสง voxel มาใช้กับการบดเคี้ยวในเกมสไตล์ Minecraft ได้อย่างไร
ฉันใช้ C # และ XNA อัลกอริทึมปัจจุบันของฉันสำหรับให้แสงสว่างเป็นวิธีเรียกซ้ำ อย่างไรก็ตามมันมีราคาแพงจนถึงจุดที่ก้อน 8x128x8 หนึ่งก้อนคำนวณทุก 5 วินาที มีวิธีการให้แสงแบบอื่นที่จะทำให้เกิดเงาแบบแปรผันได้หรือไม่? หรือวิธีการเวียนเกิดเป็นวิธีที่ดีและบางทีฉันอาจทำผิด ดูเหมือนว่าสิ่งที่เกิดขึ้นซ้ำ ๆ นั้นมีราคาแพง (ถูกบังคับให้ผ่านบล็อกประมาณ 25k ต่อก้อน) ฉันกำลังคิดเกี่ยวกับการใช้วิธีการคล้ายกับการติดตามรังสี แต่ฉันไม่รู้ว่ามันจะทำงานอย่างไร อีกสิ่งหนึ่งที่ฉันพยายามคือการจัดเก็บแหล่งกำเนิดแสงในรายการและสำหรับแต่ละบล็อกจะได้ระยะห่างจากแหล่งกำเนิดแสงแต่ละจุดและการใช้แสงนั้นไปยังระดับที่ถูกต้อง แต่แสงจะผ่านกำแพง รหัสการเรียกซ้ำปัจจุบันของฉันอยู่ด้านล่าง สิ่งนี้ถูกเรียกจากที่ใด ๆ ในก้อนที่ไม่มีระดับแสงเป็นศูนย์หลังจากการล้างและเพิ่มแสงแดดและคบไฟใหม่ world.get___atเป็นฟังก์ชั่นที่สามารถรับบล็อกด้านนอกของก้อนนี้ (นี่คือภายในชั้นเรียนชิ้น) Locationเป็นโครงสร้างของตัวเองที่คล้ายกับ a Vector3แต่ใช้จำนวนเต็มแทนค่าทศนิยม light[,,]เป็น lightmap สำหรับชิ้นข้อมูล private void recursiveLight(int x, int y, int z, byte lightLevel) { Location loc = new …

2
วิธีการตรวจสอบว่าห้องที่ใช้ voxel 3D ถูกปิดผนึกอย่างมีประสิทธิภาพ
ฉันเคยมีปัญหาบางอย่างกับการพิจารณาว่าห้องขนาดใหญ่ถูกผนึกในห้อง 3D แบบ voxel หรือไม่ ฉันอยู่ในจุดที่ฉันพยายามอย่างหนักที่สุดในการแก้ปัญหาโดยไม่ขอความช่วยเหลือ แต่ไม่พยายามให้มากพอฉันจึงขอความช่วยเหลือ เพื่อชี้แจงให้ชัดเจนว่าเป็นสิ่งที่ไม่มีรูในห้อง มีเครื่องซีลออกซิเจนซึ่งตรวจสอบว่าห้องถูกปิดผนึกหรือไม่และขึ้นอยู่กับระดับของออกซิเจน ตอนนี้นี่เป็นวิธีที่ฉันทำ: เริ่มต้นที่บล็อกด้านบนกระเบื้องจับแมวน้ำ (ช่องระบายอากาศอยู่ที่ใบหน้าด้านบนของเครื่องปิดผนึก) วนซ้ำวนซ้ำในทั้ง 6 ทิศทางที่อยู่ติดกัน หากไทล์ที่อยู่ติดกันเป็นไทล์แบบไม่มีการดูดให้ดำเนินการต่อผ่านลูป หากแผ่นที่อยู่ติดกันไม่เต็มหรือเป็นแผ่นสูญญากาศให้ตรวจสอบว่ามีบล็อกที่อยู่ติดกันหรือไม่ ทุกครั้งที่มีการตรวจสอบไพ่ให้ลดจำนวนตัวนับ หากการนับมีค่าเป็นศูนย์หากบล็อกสุดท้ายอยู่ติดกับแผ่นสูญญากาศให้ส่งคืนพื้นที่ที่ถูกปิดผนึก หากจำนวนการเข้าศูนย์เป็นศูนย์และบล็อกสุดท้ายไม่ใช่แผ่นสูญญากาศหรือลูปวนซ้ำจะสิ้นสุดลง (ไม่มีแผ่นสูญญากาศเหลืออยู่) ก่อนที่ตัวนับจะเป็นศูนย์พื้นที่จะถูกปิดผนึก หากพื้นที่ไม่ได้ปิดผนึกให้เรียกใช้การวนซ้ำอีกครั้งด้วยการเปลี่ยนแปลงบางอย่าง: ตรวจสอบบล็อกที่อยู่ติดกันสำหรับแผ่น "อากาศระบายอากาศ" แทนแผ่นสูญญากาศ แทนที่จะใช้ตัวนับลดระดับให้ทำต่อไปจนกว่าจะไม่พบแผ่น "อากาศระบายอากาศ" ที่อยู่ติดกัน เมื่อวนรอบเสร็จแล้วให้ตั้งค่าบล็อกที่เลือกแต่ละบล็อกเป็นแผ่นสูญญากาศ นี่คือรหัสที่ฉันใช้: http://pastebin.com/NimyKncC ปัญหา: ฉันใช้การตรวจสอบนี้ทุก 3 วินาทีบางครั้งเครื่องซีลจะต้องวนซ้ำหลายร้อยบล็อกและโลกขนาดใหญ่ที่มีเครื่องปิดผนึกออกซิเจนหลายวงวนซ้ำแบบวนซ้ำเหล่านี้ทุกสองสามวินาทีอาจเป็นเรื่องยากมากสำหรับซีพียู ฉันสงสัยว่าใครที่มีประสบการณ์เกี่ยวกับการเพิ่มประสิทธิภาพสามารถให้มือฉันหรืออย่างน้อยก็ชี้ให้ฉันไปในทิศทางที่ถูกต้อง ขอบคุณมัด
10 java  voxels  recursion 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.