ในขณะที่ฉันเห็นด้วยกับความรู้สึก: "ไม่ต้องกังวลเกี่ยวกับเรื่องนี้เว้นแต่จะเป็นปัญหาที่พิสูจน์แล้ว" แต่ฉันคิดว่ามันควรค่ากับการเริ่มต้น: การแก้ปัญหาแบบย้อนยุคนั้นมีความเจ็บปวดมากกว่า และใช่เพียงอัปเดตไทล์ 'ใกล้เคียง' เท่านั้นคือวิธีไป แต่การจัดเก็บและการกำหนดแอดเดรสของไอเท็มในโลกเกมของคุณอย่างมีประสิทธิภาพนั้นสำคัญมากสำหรับเหตุผลด้านประสิทธิภาพ
สิ่งที่คุณคิดเกี่ยวกับที่นี่คือชุดข้อมูลที่กระจัดกระจาย: สิ่งที่ดัชนีที่มีศักยภาพมีขนาดใหญ่ (หรือไม่ จำกัด ) แต่ใช้สัดส่วนเพียงเล็กน้อยเท่านั้น จุดสำคัญคือคุณไม่ทราบว่าจะใช้สัดส่วนใด
โซลูชันมาตรฐานสำหรับปัญหาชุดข้อมูลที่กระจัดกระจายคือการแยกดัชนี / ที่อยู่ออกจากที่จัดเก็บข้อมูลจริง ดังนั้นถ้าวัตถุแบบกระเบื้องมีราคาแพงให้เก็บไว้ในรูปแบบกะทัดรัด (เช่นอาร์เรย์แบบแบน) แต่อนุญาตให้ทำดัชนีผ่านวัตถุที่ถูกกว่า ในรูปแบบที่ง่ายที่สุดนี่อาจเป็นเมทริกซ์ 2D (หรือ 3D) ซึ่งคุณสามารถสร้างดัชนีได้อย่างง่ายดายโดยการประสานงาน แต่แต่ละรายการในเมทริกซ์นั้นเป็นเพียงดัชนี จากนั้นคุณใช้ดัชนีนั้นเพื่อค้นหาเนื้อหาไทล์จริงในอาร์เรย์ขนาดกะทัดรัดแยกต่างหาก หากยังไม่มีเนื้อหาของกระเบื้องให้เพิ่มลงในส่วนท้ายของอาร์เรย์และเก็บดัชนีในเมทริกซ์ 3 มิติ
โซลูชันมีความซับซ้อนมากขึ้นหากคุณต้องการสนับสนุนการลบเนื้อหา (เนื่องจากนำไปสู่การกระจายตัวของอาร์เรย์เนื้อหา) และหากเนื้อหาเรียงต่อกันของคุณมีราคาถูกแสดงว่าน้ำหนักของดัชนีเพิ่มขึ้น (ดัชนี 32- บิตหรือ 64- บิต) อาจจะทำให้เงินออมจากการไม่จัดเก็บไทล์ที่มีศักยภาพทุกอัน นอกจากนี้ยังเป็นการค้นหาพิเศษซึ่งจะส่งผลเสียต่อประสิทธิภาพแคชของคุณ
คุณสามารถเพิ่มประสิทธิภาพการจัดเก็บได้มากยิ่งขึ้น สมมติว่าคุณจัดเรียงไทล์ของคุณเป็นชิ้น ๆ และก้อนมีความละเอียด 64x64x64 รับกระเบื้องที่ 125, 1, 132 คุณรู้ว่ามันอยู่ในกลุ่ม (1,0,2) ดังนั้นคุณจึงมีโลกซึ่งประกอบด้วยอาร์เรย์อันเล็กกะทัดรัดและเมทริกซ์ของดัชนีอัน (-1 ถ้าไม่มีก้อน) เนื้อหาของแต่ละก้อน (ถ้ามี) คือเมทริกซ์ของดัชนีไทล์ 64x64x64 (-1 หากกระเบื้องยังไม่มีอยู่) และอาร์เรย์ที่ย่อขนาดของกระเบื้องที่ใช้แล้ว ด้วยวิธีนี้คุณจะไม่เผาดัชนีกระเบื้องจำนวนมากสำหรับชิ้นส่วนที่ไม่เคยใช้ ด้วยการทำตามวิธีการนี้และเลือกตัวเลขที่เหมาะสมสำหรับกลุ่มข้อมูลย่อยคุณสามารถขยายจักรวาลของคุณอย่างหนาแน่นและควบคุมการใช้หน่วยความจำของคุณ ที่จริงแล้วถ้าคุณทำชิ้นส่วนของคุณ 32x32x32
นอกจากนี้คุณยังสามารถใช้เล่ห์เหลี่ยมเล่ห์เหลี่ยมเช่นใช้บิตลำดับสูงของดัชนีหรือกระเบื้องของคุณเพื่อหมายถึงบางสิ่งที่พิเศษ ดังนั้นหากรายการในเมทริกซ์ไทล์มีการตั้งค่าบิตสูงสุดแล้วบิตต่ำกว่า 31 บิตไม่ได้หมายถึงดัชนีไทล์แทนพวกเขาหมายถึง 'ดัชนีแปรปรวน' หรือสิ่งที่คล้ายกันและคุณสามารถดูได้ในรายการที่แยกต่างหาก เพื่อค้นหาพิกัดที่นำไปสู่