วิธีจัดการกับการเคลื่อนไหวแบบเรียลไทม์ด้วยการทำนายฝั่งไคลเอ็นต์


10

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

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


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

คำตอบ:


14

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

สิ่งที่คุณควรรู้ก่อนตัดสินใจส่งเมล็ดจริงให้ลูกค้า:

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

3

หากทั้งเซิร์ฟเวอร์และลูกค้าเห็นด้วยกับเมล็ดเมล็ดอัลกอริทึมการสุ่มส่วนใหญ่จะส่งออกค่าเดียวกัน

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