วิธีซิงโครไนซ์การกระทำเช่นการกระโดดในผู้เล่นหลายคนได้อย่างไร


11

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

สมมติว่าลูกค้า A กำลังเคลื่อนไหวเขาอยู่ที่ 100m ในเวลา 10.2 ด้วยความเร็ว 100m / วินาทีและส่งข้อมูลนี้ ลูกค้า B จะได้รับข้อมูลนี้ในภายหลังให้เป็น 10.4 ดังนั้นที่ลูกค้า B ฉันสามารถใช้การคาดการณ์และวางลูกค้า A ที่ 120m แต่ถ้าลูกค้าทำกระโดดได้ที่ 110m ที่ 10.3 ฉันไม่สามารถคาดการณ์ได้และเนื่องจากฉันใช้การคาดการณ์ฉันจึงไม่สามารถแสดงให้ลูกค้า A กระโดดข้ามไปในอดีต

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

Jump เป็นเพียงตัวอย่างอาจมีหลายสถานการณ์ที่การทำนายไม่สามารถทำได้ ดังนั้นจะจัดการกับพวกเขาอย่างไร ตัวอย่างหนึ่งดังกล่าวสามารถเป็นได้หลายเกมออนไลน์เวทีการต่อสู้เช่น Awesomenauts


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

@ คริสเตียนเฮ้! ขอบคุณสำหรับการตอบกลับ. ฉันรู้เกี่ยวกับวิธีการนี้ แต่สิ่งนี้สามารถทำให้การเล่นเกมแย่ลงหากเวลาในการตอบสนองสูงและยิ่งกว่านั้นฉันใช้ระบบ BaaS แบบเรียลไทม์ของ AppWarp ดังนั้นตรรกะทั้งหมดของฉันจึงอยู่ที่ฝั่งไคลเอ็นต์เท่านั้น
Suyash Mohan

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

ฉันเพิ่งพบชุดการสอนนี้เพื่อให้คำแนะนำที่ดีเกี่ยวกับการจัดการเวลาในการตอบสนองดูเหมือนว่ามันจะเกี่ยวข้องกับความสนใจของคุณ: ลิงค์
Kris Welsh

คำตอบ:


8

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


4
ฉันใช้วิธีนี้เมื่อเขียนเกมผู้เล่นหลายคนบนเครือข่ายครั้งแรกของฉัน อันที่จริงฉันใช้ @ggambett เป็นข้อมูลอ้างอิง มันทำงานได้ดีสำหรับฉัน
NoobsArePeople2

1

มีรายละเอียดที่เป็นธรรมเกี่ยวกับเอ็นจิ้นซอร์ส ดูเหมือนว่าจะมีซอร์สโค้ดที่เกี่ยวข้องบางส่วนพร้อมใช้งานซึ่งเป็นส่วนหนึ่งของ Source SDK

https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

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

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