คุณมีสองสิ่งที่แตกต่างกันมากในการจัดการ:
เซิร์ฟเวอร์ต้องจัดการทั้งโลกในลักษณะที่มีสิทธิ์ เพื่อการสื่อสารกับลูกค้า N (ที่ N คือ "ใหญ่") เป็นสิ่งที่จำเป็น
ลูกค้าสามารถในหลักการรู้เกี่ยวกับคนทั้งโลก แต่มันไม่จำเป็น สำหรับลูกค้าก็เพียงพอที่จะรู้เกี่ยวกับสิ่งที่อยู่ใกล้ผู้เล่น สมมติว่ามีการแบ่งพาร์ติชันที่มีลักษณะคล้ายกริดค่อนข้างหยาบจะต้องรู้เพียงเซลล์ของผู้เล่นและ 26 เซลล์รอบ ๆ เครื่องเล่น (หรือ 8 เซลล์ในกรณีที่คุณมีตาราง 2D) กริดค่อนข้างดีกว่า แต่คุณเข้าใจมัน
ตอนนี้มีรถปิคอัพจำนวนมาก "มาก" คืออะไร? คุณขุดได้ 5 สิ่งต่อวินาทีนั่นอาจเป็นตัวเลขสองโหลที่จำเป็นต้องได้รับการอัปเดตบนเซิร์ฟเวอร์และเซิร์ฟเวอร์อาจต้องส่งสัญญาณไปยังผู้เล่นอื่นที่มีพื้นที่ที่น่าสนใจทับเซลล์ของคุณ สำหรับคอมพิวเตอร์นี่เป็นข้อมูลที่ค่อนข้างไร้สาระและเป็นจำนวนที่คำนวณไม่ได้ มันอาจกลายเป็นความท้าทายเมื่อมีผู้เล่นนับแสนในเซลล์เดียวกัน (จากนั้นการแบ่งส่วนของคุณจะหยาบเกินไป)
เซิร์ฟเวอร์ไม่จำเป็นต้องรู้และไม่สนใจเกี่ยวกับการหมุนเวียนของรถปิคอัพหรือรายละเอียดดังกล่าว ทำไมมันจะ?
ลูกค้าไม่ได้สนใจเช่นกันเนื่องจากนี่เป็นเพียงแค่อาหารตาที่ลูกค้าสามารถแต่งหน้าได้ทันที
สิ่งที่จำเป็นจากมุมมองของเซิร์ฟเวอร์คือการรู้ว่าคุณกำลังขุดที่ (30, 40, 50) ในโหนดที่คุณอยู่และมันตัดสินใจว่าสิ่งนี้วางไข่เช่นวัตถุสามประเภทที่ 5 หรือวัตถุประเภทหนึ่งที่ 7 ด้วย จำนวน 3 นั่นคือทั้งหมดที่ใส่ใจและมันคือทั้งหมดที่บอกคุณ นอกจากนี้ยังจะรวมข้อมูลนั้นในข้อมูลที่ส่งไปยังคนที่ย้ายพื้นที่ที่เขาสนใจผ่านเซลล์กริดในภายหลัง (สมมติว่ามันยังอยู่ที่นั่น)
ลูกค้าได้รับการบอกว่าวัตถุสามชิ้นเกิดที่นั่น blah blah ตอนนี้ไม่ว่าลูกค้าจะแสดงแผนที่ ASCII ที่ตอนนี้มี 'D' หรือไม่หรือว่ามันแสดงกองดินที่หมุนได้มันก็เหมือนกันหมด ไม่ว่าเสาเข็มจะมีการหมุนที่แตกต่างกันหรือเฉพาะกองที่อยู่ใกล้กับผู้เล่นของคุณก็หมุนเหมือนกันทั้งหมด มันเป็นเพียงสิ่งที่ปรากฏบนจอภาพของคุณ แต่จะไม่มีผลกับคนอื่น
ดังนั้นในกรณีที่เป็นรูปธรรมที่คุณต้องการหมุนเฉพาะกองดินที่อยู่ใกล้เคียงคุณสามารถทำการตรวจสอบระยะของวัตถุทั้งหมดที่คุณรู้ เนื่องจากชุดข้อมูลไม่ใหญ่แม้กระทั่งการบังคับให้ทุกอย่างทำงาน
คุณสามารถ (และควร) ขึ้นอยู่กับขนาดการแบ่งพาร์ติชันของคุณตัดเซลล์กริดที่อยู่ห่างออกไปเล็กน้อย
แน่นอนว่าคุณสามารถแบ่งพาร์ติชั่นย่อยในเซลล์ของคุณและใช้บางอย่างที่ยอดเยี่ยม ใช้ kd-Tree ถ้าคุณต้องการ แต่อย่าคาดหวังว่าจะได้กำไรมาก คุณสามารถตัดสิ่งต่าง ๆ ด้วยแมนฮัตตัน distace หรือคุณสามารถเรียงลำดับสิ่งของของคุณในตารางเล็ก ๆ ของคุณเอง ... แต่ทำไม?
การตรวจสอบระยะทาง (ระยะทางกำลังสองจริง ๆ แต่ก็เหมือนกับคุณ) เป็นเพียงการคูณสองแบบและการเพิ่ม (ปรับให้เหมาะกับ MUL, MADD ดังนั้นเพียงแค่สองการดำเนินการ) ตามด้วยการย้ายสาขาหรือตามเงื่อนไข มันเร็วพอ ๆ กับการปฏิบัติการอื่นใดที่ไม่ตัดเซลล์ตารางทั้งหมดในเวลาเดียวกัน อันที่จริงนี่คือสิ่งที่คุณสามารถทำได้บน GPU ...
ดูว่าคุณจะมีสองสามร้อยหรืออย่างน้อยสองสามพันตรวจสอบระยะทางกับตำแหน่งเดียวกัน (ระยะทาง squared ทำงานได้ดี) คุณไม่มีปัญหามากเพียงแค่ทำการคำนวณนั้นมากยิ่งขึ้นเพราะมันค่อนข้างแคช - การวนซ้ำที่เป็นมิตรกับหน่วยความจำที่ต่อเนื่องและด้วยการเคลื่อนไหวแบบมีเงื่อนไข สิ่งที่ชอบ rot = r[i] + 1; r[i] = ((dx*dx+dy*dy) < DIST_SQ) ? rot : r[i];
(pseudocode) นั่นคือการวนซ้ำหนึ่งครั้งในอาร์เรย์ที่มีค่าไม่กี่ร้อยต่อเฟรม คอมพิวเตอร์ไม่สนใจการทำเช่นนั้นมันโหลดและต่อเนื่องกันได้ง่าย ALU ง่ายไม่มีสาขาและมีการทำซ้ำเพียงสองสามพันครั้ง
สิ่งนี้ (หลายต่อหนึ่ง) ไม่ได้เป็นปัญหาระดับเดียวกัน (หลายต่อหลาย) เช่นเดียวกับบนเซิร์ฟเวอร์ จริงๆแล้วลูกค้าไม่ใช่ปัญหา
minecraft:dirt
) และการนับ (30) ดังนั้นเมื่อผู้เล่นอยู่ใกล้พอที่จะหยิบมันขึ้นมามันก็แค่เพิ่มการนับให้มากที่สุดเท่าที่จะทำได้ไปยังคลังของผู้เล่น หากผู้เล่นมีเพียงห้องสำหรับ 6 รายการและสแต็ค 30 อยู่บนพื้นดินผู้เล่นจะได้รับ 6 และสแต็คในการนับพื้นดินลดลงถึง 24