ผมดำเนินการเซิร์ฟเวอร์เกมที่สนับสนุนดาวควบคุมเหมือนกันพัลวัน ดังนั้นคุณต้องมีเรือที่บินและยิงด้วยฟิสิกส์ความเร็ว / การเร่งความเร็ว / ลดแรงกระแทกที่ง่ายที่สุดในการขับเคลื่อนการเคลื่อนไหว
ฉันได้อ่าน Valve, Gafferon และ Gambetta และใช้อัลกอริทึมของ Gambettaเพื่อการคาดการณ์ลูกค้า:
การทำนายลูกค้าทำงานบนเรือของผู้เล่นโดยอัพเดทตำแหน่งจากเซิร์ฟเวอร์ตามที่มาและจากนั้นนำอินพุตที่ยังไม่ได้ประมวลผลโดยเซิร์ฟเวอร์ไปยังผู้เล่น
น่าเสียดายที่เกมของฉันใช้งานไม่ได้ ฉันเชื่อว่ามันเกี่ยวข้องกับความจริงที่ว่าตัวอย่างของ Gambetta ไม่ได้คำนึงถึงวัตถุที่เคลื่อนไหวอยู่แล้วหรือคำสั่งที่ได้รับการปรับปรุงทีละขั้นตอน (โดย "ขั้นตอน" ฉันหมายถึงเฟรม) ดังนั้นในเกมของฉันผู้เล่นกดขึ้นเพื่อเร่งการส่ง (ที่กำลังเคลื่อนไหว) ซึ่งยังคงเคลื่อนที่บนไคลเอนต์ส่งคำสั่งไปยังเซิร์ฟเวอร์และมักจะได้รับสแนปช็อตโลกจากเซิร์ฟเวอร์ในขั้นตอนถัดไป ฉันได้รับสิ่งที่ชอบมากขึ้น:
คำสั่ง player รันที่ไคลเอ็นต์ขั้นตอน 3แต่บนเซิร์ฟเวอร์จะรันที่เซิร์ฟเวอร์ขั้นตอนที่ 5เท่านั้น เมื่อถึงเวลาที่ลูกค้าได้รับสแนปชอตของโลกในขั้นตอนที่ 6ลูกค้าการคาดการณ์จะถูกปิดโดยเฉพาะอย่างยิ่งในความเร็วที่เร็วขึ้น
ปมของปัญหาคือว่าลูกค้ารันคำสั่งในขั้นตอนที่ 5แต่เซิร์ฟเวอร์ทำงานมันในขั้นตอนที่ 6 ฉันคิดถึงการส่งขั้นตอนไคลเอนต์ด้วยคำสั่งและให้เซิร์ฟเวอร์ย้อนกลับและเรียกใช้คำสั่งอีกครั้งด้วยขั้นตอนเวลาของไคลเอ็นต์ สิ่งนี้อาจนำไปสู่ปัญหาอื่น ๆ ที่เกิดขึ้นเช่น - สิ่งที่เกิดขึ้นกับคำสั่งที่ได้รับตั้งแต่การย้อนกลับหรือการโกงลูกค้าสามารถใช้ประโยชน์จากการเปลี่ยนขั้นตอนการส่ง
การอ่านและการดูวิดีโอเช่นนี้จาก Google กล่าวถึงวิธีการที่แตกต่างกันซึ่งคุณจะค่อยๆเปลี่ยนตำแหน่งผู้เล่นเพื่อให้ตรงกับภาพรวมในไม่กี่ขั้นตอน
คำถามของฉัน:
คุณสามารถทำให้อัลกอริทึมของ Gambetta ทำงานกับการเคลื่อนที่แบบสเต็ปคงที่ได้หรือไม่? หรือมันขัดกับแนวคิดของเกมของฉัน?
การแก้ไขแบบค่อยเป็นค่อยไปเหนือขั้นตอนเป็นวิธีที่ถูกต้องหรือไม่? ถ้าเป็นเช่นนั้นคุณจะสอดแทรกวัตถุที่เคลื่อนไหวแล้วจากตำแหน่งไคลเอนต์เพื่อให้ตรงกับสิ่งที่เพิ่งได้รับจากเซิร์ฟเวอร์ได้อย่างไร
วิธีการเหล่านี้การแก้ไขอย่างค่อยเป็นค่อยไปและอัลกอริทึมของ Gambetta สามารถทำงานควบคู่หรือไม่หรือไม่