ไฟล์ฟอร์แมทที่ดีสำหรับการจัดเก็บแผนที่ย่อยแบบสองมิติที่สามารถเติบโตได้ไม่ จำกัด ในทิศทางใด?


9

ฉันกำลังสร้างเอ็นจิ้นแผนที่ง่าย ๆ ที่จะขยายไปในทุกทิศทางโดยอัตโนมัติด้วยเนื้อหาที่สร้างขึ้นตามขั้นตอนตามต้องการ

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

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

คำตอบ:


7

ฉันจะแนะนำไม่ให้ใช้ไฟล์ flat เดียวสำหรับข้อมูลจำนวนไม่ จำกัด ตามหลักเหตุผล

หากคุณมีข้อมูลจำนวนไม่ จำกัด ในทางทฤษฎีแล้วคุณจำเป็นต้องเข้าถึงแบบสุ่มซึ่งหมายถึงหลายไฟล์หรือฐานข้อมูล - หรือรูปแบบไฟล์แบนที่จัดทำดัชนีซึ่งเกี่ยวข้องกับการแก้ปัญหาการจัดทำดัชนีที่แก้ไขแล้วโดยระบบไฟล์หรือฐานข้อมูล

หากคุณกระจายชิ้นของคุณไปยังหลาย ๆ ไฟล์การรับอันที่ (-110, 5000) เป็นเพียงการพูดว่า "% APPDATA% / เกม / แผนที่ / -110 / 5000.dat" (หรือชื่อไฟล์อื่น ๆ ถ้าคุณต้องการ เริ่มบีบอัดพวกเขา) ฐานข้อมูลต้องการเพียงแบบสอบถาม หากอันใดไม่มีข้อมูลใด ๆ คุณก็ไม่สามารถเก็บอะไรได้เลย ไฟล์แฟลตไฟล์เดียวไม่มีความเร็วและความสะดวกในการเข้าถึงแบบสุ่มทันที

ในไฟล์เดียวที่มีขนาดตามอำเภอใจสำหรับการเข้าถึงแบบสุ่มอย่างรวดเร็วคุณต้องมีการรับประกันตำแหน่งของกลุ่มข้อมูลใด ๆ ซึ่งหมายถึงการใช้ดัชนี (เนื่องจากการค้นหาไบนารีแบบดิบผ่านชิ้นข้อมูลของคุณทำให้ประสิทธิภาพการทำงานแย่ลงและสร้างตารางใน ไฟล์ที่มีจุด "blank" จะทำให้คุณเกิดปัญหา Byte56 ) เมื่อคุณพัฒนาระบบการจัดทำดัชนีให้มีประสิทธิภาพและเขียน API ด้วยตัวคุณเองคุณได้สร้างระบบไฟล์หรือฐานข้อมูลขึ้นใหม่ เว้นแต่ว่าคุณจะได้อะไรจากการทำจริง ๆ มันก็อาจจะไม่คุ้มค่ากับการลงทุน ตัวอย่างเช่น Steam ได้รับประโยชน์อย่างมากจากรูปแบบไฟล์ GCF / NCF

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


4

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

หากคุณต้องติดไฟล์เดียวคุณอาจพบแรงบันดาลใจในการใช้งานจาก ext2 fs http://en.wikipedia.org/wiki/Ext2ฉันรู้ว่ามันช่วยให้ฉันตัดสินใจได้ดีเมื่อฉันต้องใช้ FS แบบง่ายสำหรับเกม

แต่จริงๆแล้วสำหรับแผนที่ที่กำลังเติบโตมันมักจะดีกว่าที่จะใช้ไฟล์สำหรับแต่ละอัน "เข้าถึง"


4

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

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

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


ฉันจะแนะนำให้มองเข้าไปใน SQLite sqlite.org มันเป็นตัวเองจัดทำดัชนีจัดการ blobs ฯลฯ ซึ่งจะช่วยให้มีประสิทธิภาพและที่อยู่ "หลุม" ในไฟล์ของคุณ
Daniel Blezek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.