ฉันกำลังทำเกมฟิสิกส์ที่รวดเร็วซึ่งเป็นตารางฮอกกี้ ด้วยค้อนสองตัวและลูกซนหนึ่งตัว เกมทำงานบน iphone / ipad และฉันกำลังเล่นเกมหลายคนผ่าน GameCenter
นี่คือการทำงานของระบบเครือข่าย ลูกค้าที่เป็นดาวจับคู่จะถูกตัดสินในฐานะเซิร์ฟเวอร์และลูกค้าที่ยอมรับคำขอแข่งขันคือลูกค้า
'เซิร์ฟเวอร์' มีการทำงานของฟิสิกส์และการตอบสนองนั้นเกิดขึ้นทันทีและไคลเอนต์ก็มีการทำงานของฟิสิกส์เพื่อให้ดูราบรื่นระหว่างการแลกเปลี่ยนข้อความ สิ่งที่ฉันทำในฐานะเซิร์ฟเวอร์คือฉันส่งไปยังลูกค้าความเร็วลูกตุ้มของฉันและตำแหน่งของฉันและลูกค้าปรับความเร็ว / ตำแหน่งเด็กซนของเขาที่เกี่ยวข้องกับเซิร์ฟเวอร์เพื่อให้มันซิงค์ ไม่เช่นนั้นฟิสิกส์จะซิงโครไนซ์และมันไขสกรูขึ้น
เมื่อเวลาในการตอบสนองของเครือข่ายดีผล 100 มิลลิวินาทีนั้นค่อนข้างดีฉันได้เกมที่เล่นได้อย่างราบรื่นทางฝั่งไคลเอ็นต์และพฤติกรรมแปลก ๆ นั้นน้อยที่สุด ปัญหาเกิดขึ้นเมื่อความล่าช้าอยู่ที่ประมาณ 150 ถึง 200ms ในกรณีดังกล่าวเกิดขึ้นที่ลูกค้าของฉันเด็กซนชนขอบและทิศทางกลับหัว แต่มันได้รับข้อความล่าช้าจากเซิร์ฟเวอร์และมันกลับเล็กน้อยทำให้เกิดความรู้สึกแปลก ๆ กับพฤติกรรมลูก
ฉันได้อ่านบางสิ่งเกี่ยวกับเรื่องนี้:
Wikipedia เกี่ยวกับ Clock Sync
ดังนั้นฉันจะแก้ปัญหานี้อย่างไร เท่าที่ฉันได้อ่านตัวเลือกที่ดีที่สุดที่ฉันต้องทำคือการซิงโครไนซ์นาฬิกาบนเซิร์ฟเวอร์ / ไคลเอ็นต์ด้วยการประทับเวลาเพื่อที่เมื่อฉันได้รับข้อความหน่วงเวลาที่เกี่ยวข้องกับนาฬิกาของฉันฉันก็ไม่สนใจแล้วปล่อยให้ลูกค้าจำลอง งาน. พวกคุณเห็นด้วยไหม? และเนื่องจากฉันกำลังส่งข้อมูลที่ไม่น่าเชื่อถือ (UDP) ฉันอาจได้รับข้อความหรือข้อความล่าช้า
หากเป็นวิธีที่ดีที่สุดฉันจะใช้การซิงโครไนซ์นาฬิกาได้อย่างไร ฉันอ่านขั้นตอนเกี่ยวกับวิธีการ แต่ฉันไม่เข้าใจมันมากนัก
มันบอกว่า:
- ลูกค้าประทับเวลาท้องถิ่นปัจจุบันบนแพ็กเก็ต "คำขอเวลา" และส่งไปยังเซิร์ฟเวอร์
- เมื่อได้รับจากเซิร์ฟเวอร์เซิร์ฟเวอร์จะประทับตราเวลาและส่งคืน
- เมื่อลูกค้าได้รับลูกค้าจะลบเวลาปัจจุบันจากเวลาที่ส่งและหารด้วยสองเพื่อคำนวณเวลาแฝง มันลบเวลาปัจจุบันจากเวลาเซิร์ฟเวอร์เพื่อกำหนดเดลตาเวลาไคลเอนต์ - เซิร์ฟเวอร์และเพิ่มครึ่งเวลาในการรับเดลต้านาฬิกาที่ถูกต้อง (จนถึงตอนนี้ algothim นี้คล้ายกับ SNTP มาก)
- ไคลเอนต์ทำซ้ำขั้นตอนที่ 1 ถึง 3 ห้าหรือมากกว่าครั้งหยุดสองสามวินาทีในแต่ละครั้ง การรับส่งข้อมูลอื่นอาจได้รับอนุญาตในระหว่างกาล แต่ควรย่อให้เล็กสุดเพื่อผลลัพธ์ที่ดีที่สุดผลลัพธ์ของการรับแพ็คเก็ตจะถูกสะสมและเรียงลำดับในเวลาแฝงต่ำสุดถึงลำดับสูงสุดเวลาแฝงสูงสุด ค่ามัธยฐานแฝงถูกกำหนดโดยการเลือกตัวอย่างจุดกลางจากรายการสั่งซื้อนี้
- ตัวอย่างทั้งหมดข้างต้นประมาณ 1 ส่วนเบี่ยงเบนมาตรฐานจากค่ามัธยฐานจะถูกละทิ้งและตัวอย่างที่เหลือจะถูกเฉลี่ยโดยใช้ค่าเฉลี่ยเลขคณิต
ทำตามตัวอย่างนี้ฉันจะได้:
ทำให้เกมดังกล่าวโหลดแล้วและเวลาไคลเอ็นต์ของฉันคือ 0 ตอนนี้ดังนั้นฉันส่งไปยังเซิร์ฟเวอร์ว่าเวลาของฉันคือ 0
ข้อความใช้เวลา 150ms เพื่อไปยังเซิร์ฟเวอร์ แต่นาฬิกาของเซิร์ฟเวอร์เริ่มต้นแล้วและเป็น 1 วินาทีก่อนหน้าไคลเอ็นต์ เมื่อเซิร์ฟเวอร์ได้รับข้อความเวลาจะเป็น: 1.15 และส่งเวลานั้นไปยังลูกค้าเราดีหรือไม่? ปล่อยให้ความล่าช้าของเราอยู่ที่ 150ms
ตอนนี้ไคลเอนต์ได้รับเวลา 1.15 และลบเวลาปัจจุบันจากเวลาที่ส่งและหารด้วยสองเพื่อคำนวณเวลาแฝง ซึ่งคือ: 0.3 - 0 = 0.3 / 2 -> 150ms
มันลบเวลาปัจจุบันจากเวลาเซิร์ฟเวอร์เพื่อกำหนดเดลตาเวลาไคลเอนต์ - เซิร์ฟเวอร์และเพิ่มครึ่งเวลาในการรับเดลต้านาฬิกาที่ถูกต้อง:
เวลาไคลเอ็นต์: 0.3 เวลาเซิร์ฟเวอร์ 1.15
0.3 - 1.15 = .85 + เวลาแฝง (.15) = 1
การซิงโครไนซ์เป็นอย่างไร ฉันกำลังคิดถึงอะไร
เป็นครั้งแรกของฉันที่ได้รับประสบการณ์ผู้เล่นหลายคนและเครือข่ายดังนั้นฉันจึงสับสนเล็กน้อย
ขอบคุณ.