การทำนายการเคลื่อนไหวสำหรับผู้ที่ไม่ใช่นักกีฬา


35

ฉันกำลังทำงานในเกม 2D แบบสามมิติที่มีผู้เล่นหลายคนในระดับปานกลางโดยมีผู้เล่นประมาณ 20-30 คนเชื่อมต่อพร้อมกันกับเซิร์ฟเวอร์ถาวร ฉันมีปัญหาในการใช้การทำนายการเคลื่อนไหวที่ดี

ฟิสิกส์ / การเคลื่อนไหว

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

ในลูปเกมหลัก "อัปเดต" จะถูกเรียกก่อน "วาด" ตรรกะการอัปเดตจะทำให้เกิด "ภารกิจการอัปเดตทางฟิสิกส์" ที่ติดตามเอนทิตีทั้งหมดด้วยความเร็วที่ไม่เป็นศูนย์ใช้การรวมขั้นพื้นฐานมากเพื่อเปลี่ยนตำแหน่งเอนทิตี ตัวอย่างเช่น: entity.Position + = entity.Velocity.Scale (ElapsedTime.Seconds) (โดยที่ "วินาที" เป็นค่าจุดลอยตัว แต่วิธีการเดียวกันจะใช้งานได้กับค่าจำนวนเต็มมิลลิวินาที)

จุดสำคัญคือไม่ต้องใช้การแก้ไขสำหรับการเคลื่อนไหว - เครื่องยนต์ฟิสิกส์พื้นฐานไม่มีแนวคิดของ "สถานะก่อนหน้า" หรือ "สถานะปัจจุบัน" เพียงตำแหน่งและความเร็ว

การเปลี่ยนสถานะและแพ็คเก็ตอัพเดท

เมื่อความเร็วของเอนทิตีของตัวละครที่ผู้เล่นกำลังควบคุมการเปลี่ยนแปลงแพ็คเก็ต "ย้ายอวตาร" จะถูกส่งไปยังเซิร์ฟเวอร์ที่มีประเภทการกระทำของเอนทิตี (ยืนเดินวิ่ง) ทิศทาง (ตะวันออกเฉียงเหนือ) และตำแหน่งปัจจุบัน สิ่งนี้แตกต่างจากการทำงานของเกมสามคนแรก ในเกม 3D ความเร็ว (ทิศทาง) สามารถเปลี่ยนเฟรมเป็นเฟรมขณะที่ผู้เล่นเคลื่อนที่ การส่งทุกการเปลี่ยนแปลงสถานะจะส่งแพ็กเก็ตต่อเฟรมได้อย่างมีประสิทธิภาพซึ่งจะแพงเกินไป แต่เกม 3D ดูเหมือนจะเพิกเฉยต่อการเปลี่ยนแปลงสถานะและส่งแพ็กเก็ต "state update" ในช่วงเวลาคงที่ - พูดทุก ๆ 80-150ms

เนื่องจากการอัปเดตความเร็วและทิศทางเกิดขึ้นบ่อยครั้งมากในเกมของฉันฉันจึงสามารถออกไปพร้อมกับส่งการเปลี่ยนแปลงทุกสถานะได้ แม้ว่าการจำลองทางฟิสิกส์ทั้งหมดจะเกิดขึ้นที่ความเร็วเดียวกันและแน่นอน แต่ความหน่วงแฝงยังคงเป็นปัญหาอยู่ ด้วยเหตุนี้ฉันส่งแพ็คเก็ตอัปเดตตำแหน่งประจำ (คล้ายกับเกม 3 มิติ) แต่บ่อยครั้งมากน้อยลง - ตอนนี้ทุก ๆ 250ms แต่ฉันสงสัยว่าด้วยการทำนายที่ดี ปัญหาที่ใหญ่ที่สุดคือตอนนี้ฉันเบี่ยงเบนจากบรรทัดฐาน - เอกสารอื่น ๆ คู่มือและตัวอย่างออนไลน์ทั้งหมดส่งอัปเดตตามปกติและแก้ไขระหว่างรัฐทั้งสอง ดูเหมือนว่าเข้ากันไม่ได้กับสถาปัตยกรรมของฉันและฉันต้องการอัลกอริธึมการทำนายการเคลื่อนไหวที่ดีกว่าซึ่งใกล้เคียงกับสถาปัตยกรรม "ฟิสิกส์เครือข่าย" (ใกล้มาก)

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

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

การทำนายและการชดเชยความล่าช้า

ดังกล่าวข้างต้นลูกค้ามีอำนาจสำหรับตำแหน่งของตนเอง ยกเว้นในกรณีของการโกงหรือความผิดปกติ Avatar ของลูกค้าจะไม่ถูกปรับตำแหน่งโดยเซิร์ฟเวอร์ ไม่มีการคาดการณ์ ( "ย้ายในขณะนี้และต่อมาถูกต้อง") เป็นสิ่งจำเป็นสำหรับ avatar ของลูกค้า - สิ่งที่ผู้เล่นเห็นเป็นที่ถูกต้อง อย่างไรก็ตามจำเป็นต้องมีการคาดการณ์หรือการแก้ไขบางอย่างสำหรับเอนทิตีระยะไกลทั้งหมดที่กำลังเคลื่อนที่ การคาดการณ์และ / หรือการชดเชยความล่าช้าบางอย่างจำเป็นต้องมีอย่างชัดเจนภายในเครื่องจำลอง / ฟิสิกส์ของลูกค้า

ปัญหาที่เกิดขึ้น

ฉันดิ้นรนกับอัลกอริทึมที่หลากหลายและมีคำถามและปัญหามากมาย:

  1. ฉันควรคาดการณ์สอดแทรกหรือทั้งสองอย่าง "ความรู้สึกลำไส้" ของฉันคือฉันควรใช้การคาดการณ์ที่บริสุทธิ์โดยยึดตามความเร็ว ลูกค้าจะได้รับการเปลี่ยนแปลงสถานะลูกค้าจะคำนวณความเร็ว "คาดการณ์" ที่ชดเชยความล่าช้าและระบบฟิสิกส์ปกติจะจัดการส่วนที่เหลือ อย่างไรก็ตามมันรู้สึกขัดแย้งกับโค้ดตัวอย่างและบทความอื่น ๆ ทั้งหมด - พวกเขาดูเหมือนจะเก็บหมายเลขของรัฐและทำการแก้ไขโดยไม่ต้องใช้กลไกทางฟิสิกส์

  2. เมื่อแพ็กเก็ตมาถึงฉันได้ลอง interpolating ตำแหน่งของแพ็คเก็ตด้วยความเร็วของแพ็คเก็ตในช่วงเวลาที่แน่นอน (พูด 200ms) จากนั้นฉันก็นำความแตกต่างระหว่างตำแหน่งที่สอดแทรกและตำแหน่ง "ข้อผิดพลาด" ปัจจุบันเพื่อคำนวณเวกเตอร์ใหม่และวางบนเอนทิตีแทนที่จะเป็นความเร็วที่ถูกส่ง อย่างไรก็ตามข้อสันนิษฐานคือแพ็กเก็ตอื่นจะมาถึงในช่วงเวลานั้นและเป็นเรื่องยากที่จะ "คาดเดา" เมื่อแพ็กเก็ตถัดไปจะมาถึง แนวคิดมีข้อบกพร่องพื้นฐานหรือไม่ถูกต้อง แต่ต้องการการแก้ไข / ปรับเปลี่ยนบางอย่าง?

  3. จะเกิดอะไรขึ้นเมื่อผู้เล่นระยะไกลหยุด ฉันสามารถหยุดเอนทิตีได้ทันที แต่จะถูกวางในตำแหน่ง "ผิด" จนกว่ามันจะเคลื่อนไหวอีกครั้ง ถ้าฉันประมาณเวกเตอร์หรือพยายามที่จะแก้ไขฉันมีปัญหาเพราะฉันไม่ได้เก็บสถานะก่อนหน้า - เครื่องมือฟิสิกส์ไม่มีทางที่จะพูดว่า "คุณต้องหยุดหลังจากที่คุณไปถึงตำแหน่ง X" มันเข้าใจความเร็วเพียงแค่ไม่มีอะไรซับซ้อนมากขึ้น ฉันลังเลที่จะเพิ่มข้อมูล "สถานะการเคลื่อนไหวของแพ็คเก็ต" ลงในเอนทิตีหรือเอนจินฟิสิกส์เนื่องจากมันละเมิดหลักการออกแบบขั้นพื้นฐานและทำให้รหัสเครือข่ายตกไปในเอ็นจิ้นเกมอื่น

  4. จะเกิดอะไรขึ้นเมื่อเอนทิตีชน มีสามสถานการณ์ - ผู้เล่นที่ควบคุมชนกันภายใน, สองเอนทิตีชนกันบนเซิร์ฟเวอร์ในระหว่างการอัพเดทตำแหน่งหรือการอัพเดทเอนทิตีระยะไกลชนกันบนไคลเอนต์โลคอล ในทุกกรณีฉันไม่แน่ใจว่าจะจัดการการปะทะกันอย่างไรนอกเหนือจากการโกงทั้งสองสถานะนั้น "ถูกต้อง" แต่ในช่วงเวลาที่ต่างกัน ในกรณีของเอนทิตีระยะไกลมันไม่สมเหตุสมผลที่จะวาดมันเดินผ่านกำแพงดังนั้นฉันจึงทำการตรวจจับการชนกันของไคลเอนต์ในพื้นที่และทำให้ "หยุด" จากจุดที่ # 2 ข้างต้นฉันอาจคำนวณ "เวกเตอร์ที่ถูกแก้ไข" ที่พยายามย้ายเอนทิตี "ผ่านกำแพง" อย่างต่อเนื่องซึ่งจะไม่ประสบความสำเร็จ - รีโมตอวาตาร์ติดอยู่ที่นั่นจนกว่าข้อผิดพลาดจะสูงเกินไป ตำแหน่ง. เกมทำงานด้วยวิธีนี้ได้อย่างไร


1
เกมที่เป็น 3D หรือ 2D เกี่ยวข้องกับเซิร์ฟเวอร์ประเภทใดที่คุณใช้ และทำไมเซิร์ฟเวอร์ athoritive ไม่ทำงานสำหรับเกมของคุณ?
AttackHobo

1
@Roy T. การแลกเปลี่ยนแบนด์วิดท์ แบนด์วิดธ์เป็นทรัพยากรที่มีค่าที่สุดในระบบคอมพิวเตอร์ในปัจจุบัน
FxIII

1
นั่นเป็นเพียงเรื่องจริงเกมออนไลน์ส่วนใหญ่จะถูกครอบงำโดยเวลาตอบสนองตัวอย่างเช่นในสาย 10Mbit (1.25MB / s) เวลาแฝงระหว่างเซิร์ฟเวอร์ - ไคลเอ็นต์คือ 20 มิลลิวินาทีการส่งแพ็คเก็ต 1.25kb จะใช้เวลา 20ms + 1ms การส่งแพ็คเก็ต 12.5kb จะใช้เวลา 30 มิลลิวินาที บนสายที่เร็วเป็นสองเท่าแพ็คเก็ต 1.25kb จะยังคงใช้เวลา 20ms + 0.5ms และ 20ms + 5ms สำหรับแพ็คเก็ต 12.kb ความหน่วงแฝงเป็นปัจจัยที่ จำกัดไม่ใช่แบนด์วิดท์ อย่างไรก็ตามฉันไม่ทราบว่ามีข้อมูลมากน้อยเพียงใด แต่การส่ง 50 vector3 (25x ตำแหน่ง + การหมุน 25x) มีเพียง 600 ไบต์การส่งข้อมูลนี้ทุก ๆ 20ms จะมีค่าใช้จ่าย 30kb / s (+ ค่าใช้จ่ายแพ็คเก็ต)
Roy T.

2
เครื่องมือ Quake มีการคาดการณ์ตั้งแต่รุ่นแรก การทำนายการเกิดแผ่นดินไหวมีการอธิบายที่นั่นและที่อื่น ๆ ลองดูสิ
user712092

1
คุณทำตำแหน่งนี้ + = ความเร็ว * การหน่วงเวลาสำหรับแต่ละเอนทิตีในแบบคู่ขนาน (จำเป็น: ในโค้ดคุณมีพารามิเตอร์ทางกายภาพของเอนทิตี 2 อาร์เรย์แยกจากกันหนึ่งเฟรมคุณอัปเดตที่เก่ากว่าให้ใหม่กว่า มีบางอย่างที่มีปัญหาเกี่ยวกับการทำซ้ำโดยฌอน Barret ที่ทำให้ฐานของโจร 1 เครื่องยนต์
user712092

คำตอบ:


3

สิ่งเดียวที่จะพูดได้ก็คือ 2D, isometric, 3D พวกมันเหมือนกันหมดเมื่อพูดถึงปัญหานี้ เนื่องจากคุณเห็นตัวอย่างของ 3D จำนวนมากและคุณใช้ระบบอินพุตแบบ จำกัด สองมิติด้วยความเร็วในทันทีไม่ได้หมายความว่าคุณสามารถทิ้งหลักการเครือข่ายที่มีวิวัฒนาการมาตลอด 20 ปีที่ผ่านมา

หลักการออกแบบถูกสาปแช่งเมื่อการเล่นเกมลดลง!

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

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

ในที่สุดแม้ว่าอินพุตของคุณจะถูก จำกัด มากถึง 8 ทิศทางการเปลี่ยนแปลงที่เกิดขึ้นจริงสามารถเกิดขึ้นได้ทุกเวลา - การบังคับใช้วงจร 250ms จะทำให้ผู้เล่นที่รวดเร็วไม่พอใจ ผู้เล่น 30 คนไม่มีอะไรใหญ่โตสำหรับเซิร์ฟเวอร์ที่จะจัดการ หากคุณกำลังพูดถึงหลายพัน ... แม้กระทั่งกลุ่มของพวกเขาจะถูกแบ่งออกเป็นหลายกล่องเพื่อให้เซิร์ฟเวอร์แต่ละตัวมีภาระที่สมเหตุสมผล

คุณเคยสร้างเครื่องมือทางฟิสิกส์เช่น Havok หรือ Bullet หรือไม่? พวกมันปรับให้เหมาะสมและรวดเร็วมาก คุณอาจตกหลุมพรางของการปฏิบัติการสมมติว่า ABC จะช้าและปรับสิ่งที่ไม่ต้องการให้เหมาะสม


ปราชญ์ที่ชัดเจนคำแนะนำที่นี่! เป็นเรื่องง่ายที่จะเห็นภาพใหญ่หลวม ฉันใช้ TCP ในกรณีนี้ ปัญหา "8 ทิศทาง" นั้นไม่ได้เป็นปัญหามากในแง่ของอินพุต - มันเป็นปัญหามากขึ้นเกี่ยวกับการแก้ไขและการคาดการณ์ กราฟิกถูก จำกัด อยู่ที่มุมเหล่านั้นและใช้สไปรต์เคลื่อนไหว - การเล่นเกม "ดูแปลก" หากผู้เล่นเคลื่อนที่ในมุมที่แตกต่างหรือความเร็วที่ไกลเกินกว่าบรรทัดฐาน
ShadowChaser

1

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

สำหรับคำถามแรกของคุณเมื่อผู้เล่นในพื้นที่ได้รับทิศทางของผู้เล่นอื่นนอกเหนือจากความสามารถในการลดความเร็วการเคลื่อนที่ของเขาในช่วงเวลาหนึ่งและใช้การชนฉันไม่เห็นว่าคุณสามารถทำนายทิศทางที่ผู้เล่นจะหันหน้าไปได้อย่างไร 8 ทิศทางสภาพแวดล้อม

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

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

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


ขอบคุณ - ฟังดูใกล้เคียงกับสิ่งที่ฉันต้องการโดยเฉพาะในฝั่งเซิร์ฟเวอร์ สิ่งหนึ่งที่น่าสนใจคือแม้ว่าผู้เล่นจะถูกล็อคเป็น 8 ทิศทางการเคลื่อนไหวภายในเป็นเวกเตอร์ 3 มิติ ฉันคิดเกี่ยวกับเรื่องนี้อีกเล็กน้อยในวันที่ผ่านมาและฉันคิดว่าฉันกำลังดิ้นรนกับความจริงที่ว่าฉันไม่ได้ทำการแก้ไขใด ๆ เลยฉันแค่ใช้การผสมผสานขั้นพื้นฐานการตั้งค่าความเร็วและการอัปเดตตำแหน่งตาม เวกเตอร์แต่ละการอัปเดต
ShadowChaser

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

คุณแน่ใจหรือไม่ว่าจะรวมตำแหน่งที่ถูกต้องที่tถึงt + 1ก่อนที่จะรวมตำแหน่งที่ไม่ถูกต้องกับตำแหน่งที่ถูกเดาที่ t + 1
Jonathan Connell

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

1
ใช่รวมถึงการประทับเวลาคงที่อาจไม่ใช่ความคิดที่ดี ฉันกังวลว่าการเคลื่อนไหว 8 ทิศทางที่ไม่แน่นอนจะเป็นเรื่องยากมาก อย่างไรก็ตามคุณอาจลองใช้เวลาแฝงเฉลี่ยของลูกค้าเพื่อคาดการณ์ t + 1 และมีเกณฑ์ด้านบนซึ่งคุณจะ "ส่งผ่าน" ผู้เล่นคนอื่น ๆ ไปยังตำแหน่งใหม่ของพวกเขาเสมอ
Jonathan Connell

0

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

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


-1

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

ตัวอย่างส่วนใหญ่ที่ฉันเห็นมีการคาดคะเนการเคลื่อนไหวของคู่อย่างแน่นหนา ตัวอย่างเช่นการจัดเก็บสถานะก่อนหน้าพร้อมกับสถานะปัจจุบัน ฉันต้องการหลีกเลี่ยงปัญหานั้นและรักษาเอนทิตีด้วย "สถานะปัจจุบัน" ของพวกเขาเท่านั้น มีวิธีที่ดีกว่าในการจัดการกับเรื่องนี้?

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

จะเกิดอะไรขึ้นเมื่อผู้เล่นหยุด ฉันไม่สามารถสอดแทรกตำแหน่งที่ถูกต้องเนื่องจากพวกเขาอาจต้องเดินถอยหลังหรือทิศทางแปลก ๆ หากตำแหน่งของพวกเขาอยู่ไกลเกินไป

ทำไมคุณต้องสอดแทรก? เซิร์ฟเวอร์ที่มีสิทธิ์ควรลบล้างการเคลื่อนไหวที่ผิดพลาดใด ๆ

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

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

ขออภัยสำหรับคำตอบอย่างรวดเร็วฉันต้องออกไป อ่านบทความนี้มันพูดถึงนักกีฬา แต่ควรทำงานสำหรับเกมใด ๆ ที่ต้องใช้เครือข่ายเรียลไทม์


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

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

1
-1 สิ่งที่คุณเขียนเพียงสัมผัสรางในหัวข้อ; รู้สึกคลุมเครือ รู้รอบรู้สึกย่อยเมื่อพวกเขาเป็นหลัก "อ่านบทความยาว ๆ นี้" ในขณะที่ไม่มีข้อมูลที่เป็นประโยชน์จากบทความที่อยู่ในมือ
AttackHobo

1
@AttackingHobo ฉันต้องเห็นด้วยกับคุณ ฉันพูดว่าฉันรีบ แต่ก็ไม่มีข้อแก้ตัว ถ้าฉันไม่มีเวลาจะดีกว่าถ้าปล่อยไว้ตามลำพัง บทเรียน.
Gyan aka Gary Buyn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.