การชดเชยความล่าช้าด้วยเกม 2D บนเครือข่าย


31

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

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

โดยทั่วไปแล้ววิธีนี้ใช้งานได้กับการถ่ายภาพและอะไรแบบนั้น?

ขอบคุณ

คำตอบ:


58

สรุปสำหรับผู้ที่ไม่ชอบคำตอบที่ยาว ...

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


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

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

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

ตัวอย่างเพื่อแสดงให้เห็นว่าสิ่งต่าง ๆ เกิดความสับสนได้อย่างไร

ลองนึกภาพเกมที่ผู้เล่นสองคน (ไคลเอนต์) เชื่อมต่อกับเซิร์ฟเวอร์ ใช้เวลา 100 มิลลิวินาที (1 / 10th วินาที) เพื่อให้ข้อความผ่านอินเทอร์เน็ตจากไคลเอนต์ไปยังเซิร์ฟเวอร์ เมื่อผู้เล่นทำอะไรบางอย่างข้อความจะถูกส่งไปยังเซิร์ฟเวอร์เพื่อบอกว่าพวกเขาทำอะไร จากนั้นเซิร์ฟเวอร์จะส่งข้อความไปยังผู้เล่นคนอื่นเพื่อให้พวกเขารู้ว่าผู้เล่นคนนั้นทำอะไร

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

ลองดูวิธีต่างๆในการจัดการกับสิ่งนี้และผลลัพธ์จะเป็นอย่างไร ...

จะเป็นอย่างไรถ้ามีการคำนวณฟิสิกส์เพียงแค่เซิร์ฟเวอร์

สมมติว่าเรามีการคำนวณทางฟิสิกส์เฉพาะบนเซิร์ฟเวอร์ ผู้เล่น A ส่งข้อความ "I hit crate ด้วยวิธีนี้" ไปยังเซิร์ฟเวอร์, 1 / 10th วินาทีหลังจากนั้นเซิร์ฟเวอร์จะได้รับข้อความ ผู้เล่น B ส่งข้อความว่า "ฉันโดนลังไม้แบบนี้" เซิร์ฟเวอร์จะคำนวณการเปลี่ยนแปลงทางฟิสิกส์จากการรวมกันของการกระทำสองอย่างและส่งข้อความกลับไปยังผู้เล่นทั้งสองว่า "ตกลงมันเคลื่อนที่แบบนี้" ฟิสิกส์ที่สมบูรณ์แบบจะดำเนินการตามการกระทำของผู้เล่นทั้งสองรวมกัน

แต่ปัญหาคือมันจะเป็น 2 / 10th ของวินาทีก่อนที่ผู้เล่นจะเห็นลังตอบสนอง ข้อความจากผู้เล่นทั้งสองใช้เวลา 1 / 10th วินาทีในการเข้าถึงเซิร์ฟเวอร์จากนั้นอีก 1 / 10th วินาทีเพื่อให้เซิร์ฟเวอร์ส่งผลการคำนวณสำหรับผู้เล่นทั้งสอง

บรรทัดล่างสุดเพลย์ล้าหลัง

จะเป็นอย่างไรถ้ามีการคำนวณฟิสิกส์กับลูกค้า

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

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

2 / 10th วินาทีต่อมาข้อความมาถึงจากเซิร์ฟเวอร์ถึงลูกค้า A ถูกบอกในสิ่งที่ B ทำและ B บอกในสิ่งที่ A ทำ ปัญหาคือว่าลูกค้าทั้งสองพูดว่า "ผู้เล่น X อาจทำสิ่งนั้นได้ที่จุดนี้ แต่ไม่มีลังที่ตำแหน่งนั้นอีกต่อไป

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

จะเกิดอะไรขึ้นถ้ามีการคำนวณฟิสิกส์ในไคลเอนต์และเซิร์ฟเวอร์

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

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

บรรทัดล่างคือเกมที่ผิดพลาด

ข้อสรุป

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

สิ่งที่คุณสามารถทำได้เพื่อทำให้เกมหลายคนทำงานได้ดี

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

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

ทำให้วัตถุที่เป็นวัตถุทางฟิสิกส์เฉพาะเมื่อจำเป็นต้องเป็นวัตถุทางฟิสิกส์เพื่อให้จำนวนของวัตถุทางฟิสิกส์ที่ใช้งานอยู่ต่ำ

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

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

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

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

ภาคผนวก: วิธีการที่เกมยิงจัดการกับมันอย่างไร

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

ลองนึกภาพสถานการณ์ที่ผู้เล่น A ยิงผู้เล่น B เกมยิงทั่วไปของคุณจะทำอะไรแบบนี้ ...

  1. A จะคำนวณในท้องถิ่นหากพวกเขากด B และหากดูเหมือนว่ามีการโจมตีจะเล่นเอฟเฟกต์ "hit" เหมือนพัฟเลือด นี่คือด้านไคลเอนต์เพื่อให้ผู้เล่นเห็นปฏิกิริยาต่อการกระทำของพวกเขาทันที หากคุณไม่ทำเช่นนี้เกมจะรู้สึกล้าหลัง
  2. A ยังส่งข้อความไปยังเซิร์ฟเวอร์โดยบอกว่า "ฉันยิงไปตามเวกเตอร์นี้"
  3. เมื่อเซิร์ฟเวอร์ได้รับข้อความมันจะดูว่าฝ่ายไอทีคิดว่าผู้เล่นอยู่ที่ใดและตัดสินใจว่าเวกเตอร์ช็อตของ A นั้นมาถึง B.
  4. หากเซิร์ฟเวอร์ตัดสินใจ A hit B เซิร์ฟเวอร์จะตัดสินว่า Hit เป็น B และจะส่งข้อความไปยังลูกค้าทั้งสองคนว่าเกิดอะไรขึ้น
  5. หากเซิร์ฟเวอร์ตัดสินใจว่า A ไม่ได้กด B, B ก็ใช้ได้และ A "พลาด" อาจดูเหมือน A เหมือนกับที่พวกเขาตี ("ฉันเห็นพัฟเลือด!") แต่เซิร์ฟเวอร์เรียกว่าพวกเขาพลาด

A miss B จะเป็นไปได้อย่างไรเมื่อดูเหมือนว่าพวกเขาตีพวกเขา? เนื่องจาก B อาจย้าย แต่ A ยังไม่เห็นเนื่องจากเซิร์ฟเวอร์ยังไม่ได้ส่งข้อความ "B ย้ายมาที่นี่" ถึงลูกค้า

Valve มีข้อเขียนที่ดีในเว็บไซต์ของพวกเขาเกี่ยวกับเรื่องนี้ ดูhttp://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking


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

1
คุณอาจต้องการกลับไปอ่านโพสต์ของฉันอีกครั้ง ลบบางความเห็นที่ส่วนหน้าของฉันฉันอธิบายสิ่งที่เกิดขึ้นในการจำลองทางฟิสิกส์กับผู้เล่นหลายคน - รวมถึงเซสชันเกม Mod ของ Garry คุณไม่สามารถหลีกเลี่ยงข้อเท็จจริง
Tim Holt

2
ตกลงฉันเปลี่ยน downvote เป็น upvote แต่คุณวาดภาพเชิงลบจริงๆสำหรับเกมที่มีผู้เล่นหลายคนพร้อมฟิสิกส์เมื่อมันเคยทำมาก่อนและค่อนข้างผิดพลาดฟรี
AttackHobo

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

1
+1 สำหรับ "ลองนึกภาพเรื่องราวเกี่ยวกับการอยู่ในเอกภพที่วุ่นวายด้วยกฎของฟิสิกส์ที่แตกสลายหรืออะไรบางอย่าง"
Patryk Czachurski

13

ฉันได้เขียนบทความเกี่ยวกับหัวข้อที่นี่: http://www.gabrielgambetta.com/fpm1.html

บทความสามข้อแรกจัดการกับการแนะนำหัวข้อการคาดการณ์ฝั่งไคลเอ็นต์การกระทบยอดเซิร์ฟเวอร์และการแก้ไขเอนทิตี (นี่คือส่วนที่ตอบคำถามของคุณโดยเฉพาะ) บทความที่ 4 (เร็ว ๆ นี้) จะจัดการกับ "shooting stuff" :)

คำตอบของ Tim Holt นั้นสวยมาก บทความของฉันมีไดอะแกรมสองสามข้อที่อาจช่วยให้คุณเข้าใจว่าเกิดอะไรขึ้น แต่ทิมกับฉันกำลังพูดในสิ่งเดียวกัน


สิ่งที่ดี ggambett!
ทิมโฮลท์

2
ผู้เล่นหลายคนไม่เข้าใจว่าสิ่งนี้ทำงานอย่างไร แต่สำคัญมากที่จะต้องเข้าใจนิรันดร์ "WTF ทำไมฉันถึงต้องพลาด" คำถาม.
Tim Holt

หรือ "ทำไมตัวละครของฉันผูกติดอยู่กับคอลัมน์นั้นด้วยแถบยางยักษ์" ในการเชื่อมต่อที่ลดลง :)
ggambett

Wiki ของ Valve นั้นมีการเขียนที่เกี่ยวข้องกับปัญหาเหล่านี้ หน้านี้อยู่ที่developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Tim Holt

1
ฉันรักการสาธิตสด ช่างเป็นวิธีที่ยอดเยี่ยมในการมองภาพว่าเกิดอะไรขึ้น
Richard Marskell - Drackir

2

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


0

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

โพสต์ที่ดีและคำตอบที่ดีกว่าสามารถพบได้:

จะเขียนเกมเครือข่ายได้อย่างไร?


0

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

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