ฟิสิกส์ไม่ซิงโครไนซ์อย่างถูกต้องผ่านเครือข่ายเมื่อใช้ Bullet


11

ฉันกำลังพยายามใช้ระบบฟิสิกส์ของลูกค้า / เซิร์ฟเวอร์โดยใช้ Bullet แต่ฉันมีปัญหาในการทำให้สิ่งต่าง ๆ ตรงกัน

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

  1. วัตถุแบบไดนามิกบนไคลเอนต์ที่อยู่บนเซิร์ฟเวอร์ (เช่นไม่ใช่เศษเล็กเศษน้อยและสิ่งที่ไม่สำคัญอื่น ๆ ) ทำด้วยจลนศาสตร์ ทำงานได้อย่างถูกต้อง แต่วัตถุไม่เคลื่อนไหวอย่างราบรื่นมาก
  2. วัตถุเป็นแบบไดนามิกทั้งบน แต่หลังจากแต่ละข้อความจากเซิร์ฟเวอร์ที่วัตถุได้ย้ายฉันตั้งค่าความเร็วเชิงเส้นและเชิงมุมเป็นค่าจากเซิร์ฟเวอร์และเรียก btRigidBody :: ดำเนินการต่อไปเปลี่ยนด้วยการแปลงบนเซิร์ฟเวอร์ ฉันยังเรียก btCollisionObject :: เปิดใช้งาน (จริง); เพื่อบังคับวัตถุให้อัปเดต

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

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

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


บางสิ่งที่อาจช่วยให้คุณได้รับคำตอบ: คุณใช้ภาษา / เครื่องมืออะไร มันคือประเภทของการเชื่อมต่อ? การขาดการซิงโครไนซ์แย่แค่ไหนเมื่อเทียบกับ ping กับเซิร์ฟเวอร์
Fibericon

2
ตัวเลือกที่สองไม่ทำงานเพราะคุณตั้งค่าความเร็วเฉพาะค่าเซิร์ฟเวอร์หลังจากเฟรมไม่กี่เฟรมดังนั้นระหว่างแต่ละแพ็กเก็ตจะมีเฟรมไม่กี่ตัวที่สิ่งต่าง ๆ สามารถลอยได้ ฉันอยากจะแนะนำให้อ่านกระทู้ทั้งหมดของ Gaffer ในเกมฟิสิกส์คุณควรอ่าน 'แก้ไขเวลาของคุณ' ก่อน แต่นี่เป็นบทความสุดท้ายที่พูดถึงฟิสิกส์เครือข่ายgafferongames.com/game-physics/networked-physics
รอยต.

ฉันใช้เครื่องมือพัฒนาตนเองใน C ++ อย่างไรก็ตามฉันค่อนข้างมั่นใจว่าการขาดการซิงโครไนซ์นั้นไม่ดีอาจจะเป็น 1 เฟรมมากกว่า ping ถ้าฉันต้องเดา แต่ฉันยังคงทำการทดสอบ LAN เป็นส่วนใหญ่เท่านั้น ฉันจะตรวจสอบบทความเหล่านั้นและใช่คุณมีสิทธิ์ที่ความเร็วจะปิด แต่สิ่งที่เป็นวิธีที่ปิดเช่นลังอยู่ฝั่งตรงข้ามแผนที่ ไม่ควรตั้งค่าการแปลงอย่างชัดเจนในที่สุด (ถึงแม้ว่ามันจะยังไม่สวยก็ตาม jiggles และอื่น ๆ )
ลู

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

การอ่านที่น่าสนใจที่เกี่ยวข้องส่วนหนึ่งกับหัวข้อของคุณ: gamasutra.com/view/feature/3094/... มันเกี่ยวกับ rts และไม่เกี่ยวกับฟิสิกส์ แต่ไปถึงจุดที่พวกเขาต้องซิงค์การจำลองบนเซิร์ฟเวอร์และไคลเอนต์ วิธีที่พวกเขาทำมัน? พวกเขาใช้การจำลองแบบอิสระทั้งบนไคลเอนต์และเซิร์ฟเวอร์ แต่เซิร์ฟเวอร์ส่งแพ็กเกจส่งที่ทำให้แน่ใจว่าการจำลองไคลเอนต์ไม่ได้แตกต่างกันและได้รับการแก้ไขถ้ามันเกิดขึ้น ...
Tom van green

คำตอบ:


4

คุณต้องเหมาะสมทำนายฝั่งไคลเอ็นต์

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

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

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

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

สำหรับข้อผิดพลาดจริงของคุณฉันไม่คุ้นเคยกับ Bullet แต่คุณอาจพลาดค่าบางอย่างเช่นคุณตั้งค่าความเร็วเชิงเส้นและเชิงมุม แต่คุณตั้งค่าความเร่งหรือไม่


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

3

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

ฟิสิกส์อื่น ๆ ที่ฉันใช้นั่นคือ eye eye ล้วนๆไม่จำเป็นต้องซิงโครไนซ์

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


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

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

2

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

Solutions: -

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

  2. คุณสามารถมีหนึ่งภพฟิสิกส์ในเซิร์ฟเวอร์และออกอากาศตำแหน่งวัตถุและความเร็วให้กับลูกค้า


คุณอาจลองเล่นเกมเครือข่ายที่มีฟิสิกส์เพื่อดูว่าโลกไม่ได้อยู่ในการซิงค์ เช่น Need For Speed ​​World นั้นฟรีและมีตัวคูณและฟิสิกส์พื้นฐาน (กล่องบนท้องถนนและวัตถุที่ถูกทำลาย)
สูงสุด

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

1
ไม่ปกติมันเป็นภาพลวงตาของซิงโครนัส หากคุณเปรียบเทียบหน้าจอคุณจะเห็นว่าเมื่อคุณตีกลับในกล่องกล่องจะบินไปในทิศทางที่แตกต่างกัน หรือกล่องไม่ใช่ฟิสิกส์เลย (เป็นเพียงภาพเคลื่อนไหว ed) จำนวนกล่องแตกต่างกัน เมื่อฉันพูดถึงอนิเมชั่นฉันหมายถึงไม่มีอนิเมชั่นฟิสิกส์อยู่เบื้องหลังการเคลื่อนไหว พวกเขาไม่มีเทคนิคต่าง ๆ ที่ทำให้ภาพดูค่อนข้างซิงค์ แต่มันไม่ใช่โลกฟิสิกส์แบบซิงโครนัส คุณควรดูและเปรียบเทียบวิธีที่พวกเขาเคลื่อนไหวในเกมที่แตกต่างกัน
สูงสุด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.