ก่อนอื่นคุณต้องรู้วิธีการแสดงข้อมูลที่เกี่ยวข้องของคุณในลักษณะที่สอดคล้องกับโปรโตคอล ขึ้นอยู่กับข้อมูลที่เกี่ยวข้องกับเกม ฉันจะใช้เกม RTS เป็นตัวอย่าง
เพื่อจุดประสงค์ในการเชื่อมต่อเครือข่ายหน่วยงานทั้งหมดในเกมจะมีการแจกแจง (เช่นรถปิคอัพ, หน่วย, อาคาร, ทรัพยากรธรรมชาติ, สิ่งทำลายล้าง)
ผู้เล่นจะต้องมีข้อมูลที่เกี่ยวข้องกับพวกเขา (เช่นทุกหน่วยที่มองเห็นได้):
- พวกเขามีชีวิตอยู่หรือตาย?
- พวกเขาเป็นประเภทอะไร?
- พวกเขามีสุขภาพเหลืออยู่เท่าไหร่?
- ตำแหน่งปัจจุบัน, การหมุน, ความเร็ว (ความเร็ว + ทิศทาง), เส้นทางในอนาคตอันใกล้ ...
- กิจกรรม: โจมตีเดินสร้างแก้ไขรักษา ฯลฯ ...
- ผลกระทบสถานะบัฟ / ดีบัฟ
- และอาจเป็นสถิติอื่น ๆ เช่นมานะโล่และสิ่งที่ไม่?
ในตอนแรกผู้เล่นจะต้องได้รับสถานะเต็มก่อนที่เธอจะสามารถเข้าสู่เกม (หรือข้อมูลทั้งหมดที่เกี่ยวข้องกับผู้เล่นนั้น)
แต่ละหน่วยมี ID จำนวนเต็ม คุณสมบัติที่ระบุและดังนั้นจึงมีตัวระบุที่สำคัญเช่นกัน รหัสหน่วยไม่จำเป็นต้องมีความยาว 32 บิต (อาจเป็นได้ถ้าเราไม่ประหยัด) อาจเป็น 20 บิต (เหลือ 10 บิตสำหรับแอตทริบิวต์) ID ของหน่วยจะต้องไม่ซ้ำกันมันอาจได้รับมอบหมายอย่างดีจากตัวนับเมื่อหน่วยถูกสร้างอินสแตนซ์และ / หรือเพิ่มเข้าไปในโลกของเกม (อาคารและทรัพยากรถือว่าเป็นหน่วยที่ไม่สามารถเคลื่อนที่ได้และทรัพยากรสามารถกำหนด ID ได้เมื่อแผนที่ โหลดแล้ว)
เซิร์ฟเวอร์จัดเก็บสถานะโกลบอลปัจจุบัน สถานะที่อัปเดตล่าสุดของผู้เล่นแต่ละคนจะแสดงโดยตัวชี้ไปยังการlist
เปลี่ยนแปลงล่าสุด (การเปลี่ยนแปลงทั้งหมดหลังจากตัวชี้ยังไม่ถูกส่งไปยังผู้เล่นนั้น) การเปลี่ยนแปลงจะถูกเพิ่มเข้าไปlist
เมื่อเกิดขึ้น เมื่อเซิร์ฟเวอร์เสร็จสิ้นด้วยการส่งการอัปเดตล่าสุดมันสามารถเริ่มย้ำเหนือรายการ: เซิร์ฟเวอร์จะย้ายตัวชี้ของผู้เล่นไปตามรายการไปยังหางการรวบรวมการเปลี่ยนแปลงทั้งหมดไปพร้อมกันและวางไว้ในบัฟเฟอร์ที่จะส่งไปยัง ผู้เล่น (เช่นรูปแบบของโพรโทคอลสามารถเป็นดังนี้: unit_id; attr_id; new_value) หน่วยใหม่จะถูกพิจารณาว่ามีการเปลี่ยนแปลงเช่นกันและจะส่งค่าคุณลักษณะทั้งหมดไปยังผู้เล่นที่ได้รับ
หากคุณไม่ได้ใช้ภาษาที่มีตัวเก็บรวบรวมขยะคุณจะต้องตั้งค่าตัวชี้ที่ขี้เกียจซึ่งจะล้าหลังและจากนั้นไปยังตัวชี้โปรแกรมเล่นที่ล้าสมัยที่สุดในรายการโดยปล่อยวัตถุไปพร้อมกัน คุณสามารถจำได้ว่าผู้เล่นคนใดที่ล้าสมัยมากที่สุดในกองบุริมภาพหรือทำซ้ำและปล่อยให้ว่างจนกว่าตัวชี้ขี้เกียจจะเท่ากับ (เช่นชี้ไปที่ไอเท็มเดียวกันกับหนึ่งในพอยน์เตอร์ของผู้เล่น)
บางคำถามที่คุณไม่ได้ถามและฉันคิดว่าน่าสนใจคือ:
- ลูกค้าควรได้รับสแนปชอตพร้อมข้อมูลทั้งหมดตั้งแต่แรกไหม สิ่งที่เกี่ยวกับรายการนอกวิสัยทัศน์ของพวกเขา? แล้วหมอกแห่งสงครามในเกม RTS ล่ะ? หากคุณส่งข้อมูลทั้งหมดไคลเอ็นต์อาจถูกแฮ็กเพื่อแสดงข้อมูลที่ไม่ควรใช้กับเครื่องเล่น (ขึ้นอยู่กับมาตรการรักษาความปลอดภัยอื่น ๆ ที่คุณใช้) หากคุณส่งข้อมูลที่เกี่ยวข้องปัญหาจะได้รับการแก้ไข
- เมื่อใดจึงจำเป็นต้องส่งการเปลี่ยนแปลงแทนการส่งข้อมูลทั้งหมด พิจารณาแบนด์วิดท์ที่มีอยู่ในเครื่องที่ทันสมัยเราจะได้อะไรจากการส่ง "เดลต้า" แทนที่จะส่งข้อมูลทั้งหมดถ้าเป็นเช่นนั้นเมื่อไหร่?