จะชดเชยการเคลื่อนย้ายวัตถุด้วยการทำนายฝั่งไคลเอ็นต์ได้อย่างไร


11

ผมดำเนินการเซิร์ฟเวอร์เกมที่สนับสนุนดาวควบคุมเหมือนกันพัลวัน ดังนั้นคุณต้องมีเรือที่บินและยิงด้วยฟิสิกส์ความเร็ว / การเร่งความเร็ว / ลดแรงกระแทกที่ง่ายที่สุดในการขับเคลื่อนการเคลื่อนไหว

ป้อนคำอธิบายรูปภาพที่นี่

ฉันได้อ่าน Valve, Gafferon และ Gambetta และใช้อัลกอริทึมของ Gambettaเพื่อการคาดการณ์ลูกค้า:

ป้อนคำอธิบายรูปภาพที่นี่

การทำนายลูกค้าทำงานบนเรือของผู้เล่นโดยอัพเดทตำแหน่งจากเซิร์ฟเวอร์ตามที่มาและจากนั้นนำอินพุตที่ยังไม่ได้ประมวลผลโดยเซิร์ฟเวอร์ไปยังผู้เล่น

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

ป้อนคำอธิบายรูปภาพที่นี่

คำสั่ง player รันที่ไคลเอ็นต์ขั้นตอน 3แต่บนเซิร์ฟเวอร์จะรันที่เซิร์ฟเวอร์ขั้นตอนที่ 5เท่านั้น เมื่อถึงเวลาที่ลูกค้าได้รับสแนปชอตของโลกในขั้นตอนที่ 6ลูกค้าการคาดการณ์จะถูกปิดโดยเฉพาะอย่างยิ่งในความเร็วที่เร็วขึ้น

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

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

คำถามของฉัน:

  • คุณสามารถทำให้อัลกอริทึมของ Gambetta ทำงานกับการเคลื่อนที่แบบสเต็ปคงที่ได้หรือไม่? หรือมันขัดกับแนวคิดของเกมของฉัน?

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

  • วิธีการเหล่านี้การแก้ไขอย่างค่อยเป็นค่อยไปและอัลกอริทึมของ Gambetta สามารถทำงานควบคู่หรือไม่หรือไม่


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

@MakuraYami ใช่ - ฉันเริ่มเขียนบทความเพื่ออธิบายวิธีแก้ปัญหา จะอัปเดตเร็ว ๆ นี้!
OpherV

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

@makurayami ชื่อผู้ใช้ของฉันที่ Gmail
OpherV

คำตอบ:


5

ในช่วง 6 เดือนที่ฉันถามคำถามนี้ฉันได้พัฒนาเซิร์ฟเวอร์เกมโอเพนซอร์ซที่สมบูรณ์เพื่อจัดการกับปัญหาที่แน่นอนนี้ (และอื่น ๆ อีกมากมาย!): http://lance.gg

ป้อนคำอธิบายรูปภาพที่นี่

การวิจัยและพัฒนาที่เกี่ยวข้องตอนนี้อนุญาตให้ฉันตอบคำถามของฉันเอง:

  • คุณสามารถทำให้อัลกอริทึมของ Gambetta ทำงานกับการเคลื่อนที่แบบสเต็ปคงที่ได้หรือไม่? หรือมันขัดกับแนวคิดของเกมของฉัน?

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

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

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

  • วิธีการเหล่านี้การแก้ไขอย่างค่อยเป็นค่อยไปและอัลกอริทึมของ Gambetta สามารถทำงานควบคู่หรือไม่หรือไม่

    พวกเขาสามารถทำงานร่วมกันได้ แต่เฉพาะในกรณีที่การเคลื่อนย้ายเอนทิตีถูกกำหนดจาก POV ลูกค้า ดังนั้นมันจะไม่ทำงานหากเอนทิตีได้รับผลกระทบจากฟิสิกส์หรือ psuedo-physics เช่นการแทรกการลาก ฯลฯ '


1

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

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

หวังว่าจะช่วย :)


เพื่อชี้แจง - โดย "ขั้นตอน" ฉันหมายถึง "เฟรม" ซึ่งทำงาน 60 ครั้งต่อวินาที ฉันเรียกมันว่าขั้นตอน (และไม่ใช่เฟรม) เพื่อแยกความแตกต่างของการพัฒนาเกมจริงจากการเรนเดอร์ ฉันได้ติดตั้งเวอร์ชั่นของการปรับด้านเซิร์ฟเวอร์ที่ใช้งานได้ดีอยู่แล้ว คำถามนี้หมายถึงเรือของผู้เล่นเท่านั้น - ซึ่งเคลื่อนไหวตลอดเวลาโดยไม่คำนึงถึงคำสั่งของผู้เล่น (เนื่องจากแรงเฉื่อย) นั่นคือสิ่งที่ความยากลำบากของฉันอยู่ ความคิดใด ๆ :)
OpherV

เฟรมแตกต่างจากขั้นตอน ขั้นตอนจะย้ายไปในลำดับที่คงที่และคาดการณ์ได้ เฟรมย้ายจำนวนตัวแปรเวลาดังนั้นความก้าวหน้าใด ๆ จะต้องคูณด้วยเวลาเดลต้าสำหรับเฟรมนั้น
Tealr

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

สิ่งที่ฉันสังเกตสำหรับการทดลองของตัวเอง: 1 / 60s เร็วผิดปกติและฉันจะเดิมพันว่าเกมออนไลน์ส่วนใหญ่ที่มีการเข้าร่วมมากกว่า 1x1 ที่ 1 / 10s อัปเดตหรือราว ๆ นั้น
Patrick Hughes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.