Voxel Face Crawling (การลดความซับซ้อนของตาข่ายอาจใช้ความโลภ)


9

แก้ไข: นี่เป็นเพียงประสบการณ์การเรียนรู้ของฉันเองมันไม่ใช่เหตุผลด้านประสิทธิภาพที่ฉันถามคำถามนี้

นี่เป็นเรื่องเกี่ยวกับเครื่องยนต์ภูมิประเทศที่เหมือน Minecraft ฉันจัดเก็บบล็อกเป็นกลุ่ม (16x256x16 บล็อกเป็นกลุ่ม) เมื่อฉันสร้างชิ้นฉันใช้เทคนิคหลายขั้นตอนเพื่อตั้งค่าภูมิประเทศและวางวัตถุ ในขณะที่สร้างฉันจะเก็บ 1D array หนึ่งสำหรับ chunk แบบเต็ม (solid หรือไม่) และ 1D array ของ solid solid blocks

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

การใช้ 2D Atlas กับนี้เคล็ดลับเล็ก ๆ น้อย ๆ Shader แอนดรูรัสเซลปัญหาผมต้องการที่จะผสานใบหน้าที่คล้ายกันอย่างสมบูรณ์ นั่นคือถ้าพวกเขาอยู่ในรายการเดียวกัน (ปกติเหมือนกัน) อยู่ติดกันมีระดับแสงเท่ากัน ฯลฯ ฉันรู้ว่าฉันจะจบด้วยรูปสี่เหลี่ยม แต่มันควรลดจำนวนจุดยอดของฉันลง 50% หรือดีกว่าถ้าการประมาณของฉันถูกต้อง

สมมติฐานของฉันคือให้แต่ละรายการ 6 รายการเรียงลำดับตามแกนที่พวกเขาพักจากนั้นตามด้วยอีกสองแกน (รายการด้านบนของบล็อกจะเรียงตามค่า Y ตามด้วย X แล้ว Z)

ด้วยสิ่งนี้เพียงอย่างเดียวฉันสามารถรวมแถบใบหน้าได้ง่าย ๆ แต่ฉันต้องการผสานมากกว่าเพียงแค่แถบเข้าด้วยกันเมื่อเป็นไปได้ ฉันได้อ่านบนนี้ขั้นตอนวิธีการสอดคล้องโลภ แต่ฉันมีปัญหามากเข้าใจมัน

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

ฉันไม่คิดว่าประสิทธิภาพจะลดลงเล็กน้อยหากใช้งานได้ง่ายกว่าหรือดีกว่าการใช้งานแผ่น ฉันกังวลว่าอัลกอริทึมส่วนใหญ่มุ่งเน้นที่รูปสามเหลี่ยมแทนที่จะเป็นสี่คนและใช้แผนที่สองมิติแบบที่ฉันเป็นฉันไม่ทราบว่าฉันสามารถใช้รูปสามเหลี่ยมบางอย่างตามทักษะปัจจุบันของฉัน

PS: ตอนนี้ฉันคัดเฟรสตัสมาแล้วหนึ่งอันและดังที่อธิบายไว้แล้ว ฉันยังไม่บดเคี้ยวคัดและยังไม่เคยเลย

* แก้ไข: ฉันใช้เทคนิคเล็ก ๆ น้อย ๆ ของตัวเองซึ่งอาจมีชื่อ แต่ฉันก็ผ่านรายการ 6 รายการของฉันซึ่งเรียงลำดับตามแกนที่พวกเขาพักตามด้วยประเภทบล็อกแล้วตามระดับแสง ฉันวนซ้ำพวกมันสร้างสี่เหลี่ยมใหม่ขณะที่ฉันไปและขยายพวกมันไปพร้อม ๆ กัน มันไม่เหมาะสม แต่แน่นอนว่าค่อนข้างเร็วและลดยอดของฉันลงได้เกือบ 50% โดยเฉลี่ย ความคิดเห็นของ Byte56 คือตู้เสื้อผ้าฉันคิดว่าเป็นคำตอบที่แท้จริง แต่ฉันไม่สามารถเลือกได้สำหรับคำตอบ / ค่าหัว

นี่คือวิธีที่รวดเร็วและเรียบง่ายของฉันที่ฉันจัดการปัญหานี้หลังจากสร้างภูมิประเทศเริ่มต้นเต็มรูปแบบโดยไม่ต้องปรับแต่งมากนัก สมมติว่าช่องสี่เหลี่ยมที่ให้ทั้งหมดเป็นภาพเดียวกันระดับแสงปกติ ฯลฯ แต่ละสีเป็นรูปสี่เหลี่ยมที่แตกต่างกันที่ฉันต้องการแสดงผล ด้วยรายการของฉันเรียงลำดับตามที่พวกเขาเป็นนี่เป็นวิธีที่ง่าย / รวดเร็ว


หลังจากการเพิ่มประสิทธิภาพทั้งหมดของคุณคุณยังประสบปัญหาด้านประสิทธิภาพหรือไม่ คุณได้ลองทำโปรไฟล์โค้ดดูว่าปัญหาอยู่ที่ไหน?
MichaelHouse

@ Byte56 โอ้มันไม่ใช่ปัญหาด้านประสิทธิภาพเลยในขณะนี้ อาจเป็นหนึ่งในอนาคตเมื่อฉันพยายามวางสิ่งที่ฉันเรียนรู้ที่จะใช้สำหรับเกมจริง สำหรับตอนนี้ฉันแค่อยากจะเรียนรู้ ฉันไม่ได้พูดถึงเรื่องนี้เพราะดูเหมือนว่าฉันจะได้รับความช่วยเหลือน้อยลงถ้าฉันแค่ต้องการเรียนรู้สิ่งต่าง ๆ เพียงเพื่อเรียนรู้พวกเขา
Mythics

ฉันรู้สึกว่าฉันควรจะพูดด้วยเช่นกันว่าถ้าฉันได้พยายามเล่นเกมนี้อย่างเหมาะสมฉันจะต้องการให้โลกที่มองเห็นนั้นใหญ่โต ฉันไม่ต้องการให้ตัวละครมีความสูง 2 บล็อกและกว้าง 1 บล็อกเช่น Minecraft และอื่น ๆ อีกมากมาย แต่จะมีความยาว 3 บล็อคต่อยาวและสูง 6-9 ภูมิประเทศคงที่อาจเป็นไปได้ว่า
Mythics

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

@ Byte56 ขอบคุณฉันขอบคุณมันมาก แน่นอนว่ามันจะใกล้เคียงกับอัลกอริธึมที่ฉันกำลังมองหาหากไม่ได้มองเห็น ฉันจะต้องคนจรจัดกับมันเล็กน้อยเพื่อดูว่าฉันจะได้รับสี่เหลี่ยมสูงสุดทั้งหมดด้วยการวิ่งครั้งเดียวของมัน ฉันอาจจะทุ่มเงินจำนวนนี้ด้วยเช่นกันเพราะฉันคิดว่าทั้งคำถามและคำตอบโดยละเอียดจะช่วยคนอื่น ๆ ได้อีกในอนาคต
Mythics

คำตอบ:


4

คุณต้องการทำแถบหรือสี่เหลี่ยมที่ดีที่สุด ไม่มีรูปร่างอื่น ๆ ที่สามารถแก้ไขได้หรือเป็นประโยชน์กับคุณ

ฉันอยากจะชี้ให้เห็นว่าโดยการเก็บ 6 รายการต่ออันที่ทุกจุดคุณจะใช้ 5 รายการจากชิ้นในทิศทางที่สำคัญและอย่างน้อย 3 ในแต่ละอื่น ๆ คุณกำลังเสียเวลาที่นี่เมื่อไม่เพียง แต่การ์ดจอจะทำสิ่งที่เหมาะที่สุดให้กับคุณ แต่ถึงแม้ว่าคุณจะทำด้วยตัวเองคุณก็จะดีกว่าที่จะรักษาใบหน้าทั้งหมดไว้ในที่เดียวและเปรียบเทียบปกติกับทิศทางกับ กล้อง (วิจัยผลิตภัณฑ์ DOT ของเวกเตอร์)

ลิงก์ของ CaptainRedMuff เกี่ยวกับ Greedy ที่คุณเห็นมาแล้วคือคำตอบสำหรับปัญหาของคุณ มันควรจะเห็นได้ชัดจากที่คุณจะจบลงด้วยตาข่าย "Stripy" แต่พวกเขามีประสิทธิภาพอย่างสมบูรณ์และมาพร้อมกับสิ่งที่ดีที่สุดจะมีความซับซ้อนมากขึ้นและคุณได้แสดงตาข่ายโลภที่ซับซ้อนเกินไปแล้ว

หากคุณกำลังมีปัญหาเรื่องประสิทธิภาพการทำงานกับก้อนเดียวมันทำให้ฉันคิดว่าอย่างอื่นผิดอย่างมาก

การเดาครั้งแรกของฉันคือคุณกำลังเรียกวิธีการวาดบ่อยเกินไป คุณสามารถบอกให้กราฟิกการ์ดวาดระหว่าง 50 และ 400 ~ ครั้งต่อวินาทีขึ้นอยู่กับฮาร์ดแวร์ มีการโทรไปยัง. setData หรือ .draw ____ เบื้องต้นเท่าไร


สี่เหลี่ยมเป็นสิ่งที่ฉันต้องการ Byte56 เชื่อมโยงอัลกอริทึมที่ง่ายต่อการติดตามมากกว่าโลภ แต่ฉันไม่สามารถรับความคิดเห็นเป็นคำตอบ ฉันคิดว่าเขาแสดงความคิดเห็นแทนเพราะเขาเชื่อมโยงกับอัลกอริทึมแทนที่จะอธิบายเท่านั้น ฉันไม่รู้ว่าคุณหมายถึงอะไรเกี่ยวกับรายการของฉัน ฉันมักจะมี 1-2 สายต่อการรับสาย รายการของฉันถูกเก็บไว้ในหนึ่งบัฟเฟอร์ต่ออัน ฉันเปลี่ยนช่วงการวาดต่อเฟรม ฉันอาจจะผิด แต่การส่งข้อมูลที่ไม่จำเป็นไปยัง GPU นั้นดูเหมือนจะต่อต้าน ดูเหมือนจะดีกว่าการส่งข้อมูลไปยัง gpu มากขึ้นและบังคับให้ดึงออกมาหนึ่งหรือสองต่อชิ้น
Mythics

ฉันไม่มีปัญหาด้านประสิทธิภาพ ฉันสนุกกับการเรียนรู้สิ่งเหล่านี้ ฉันจะแก้ไขคำถามเพื่อพูดแบบนี้ แต่อย่างที่ฉันบอก Byte56 ฉันจะได้รับความช่วยเหลือน้อยลงหากสิ่งที่ฉันพยายามทำไม่ได้แก้ปัญหาได้จริง เพื่อตอบคำถามของคุณฉันแสดงภาพชิ้นละไม่เกิน 200-260 ต่อเฟรมในขณะนี้ นั่นคือ DrawIndexedPrimitives 500ish ที่ค่อนข้างธรรมดาต่อหนึ่งเฟรม ฉันได้รับ 100-130 FPS เป็นประจำโดยไม่มี vsync ทำให้การโทร 65,000 ครั้งต่อวินาที ฉันไม่ได้พยายามที่จะหยาบคาย แต่คุณพูดน้อยทำให้ฉันมีเหตุผล ฉันอาจไม่เข้าใจดังนั้นโปรดอธิบายรายละเอียดหากเข้าใจผิด อาจเกี่ยวข้องกับ XNA หรือเปล่า?
Mythics

อาขอโทษฉันหมายถึงพูดต่อเฟรมไม่ใช่ต่อวินาที คุณใกล้จะถึงขีด จำกัด บนสุดแล้วและถ้าคุณอยู่บนภูมิประเทศเพียงอย่างเดียว
ฟิล

ฉัน +1 คำตอบของคุณเนื่องจากทำให้ฉันคิดถึงการปรับปรุงบางอย่างที่ฉันทำได้ แต่ไม่มีอะไรเกี่ยวข้องกับคำถาม นอกจากนี้ฉันคิดว่าฉันควรแบ่งปันคำตอบจาก Nathan Reed บนลิงก์
Mythics

ฉันจะต้องค้นหาบทความที่ฉันอ่านที่อ้างถึง 400-500 เป็นขีด จำกัด Google ด่วนไม่ได้ช่วยฉัน
Phil

0

บทความที่คุณเชื่อมโยงไปยังไม่ได้ให้อัลกอริทึมสำหรับสร้างตาข่าย มันระบุวิธีการประเมินวิธีแก้ปัญหาที่เป็นไปได้

โดยทั่วไปแล้วบทความให้บทสรุปที่ดี: 1) วิธีแก้ปัญหาไร้เดียงสาไม่ดี 2) มีวิธีแก้ปัญหาที่ดีที่สุด แต่ทั้งสองใช้เวลานานในการเขียนและเรียกใช้ 3) การคัดสรรอย่างรวดเร็วให้ผลลัพธ์ที่ดีกว่ามาก ( และนี่คือสิ่งที่ Minecraft ทำเอง) และสุดท้าย 4) อาจมีทางออกที่ฉลาดกว่า (อัลกอริทึมโลภ)

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

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

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