หากคุณยังไม่ได้ผมขอแนะนำให้คุณอ่านบทความทั้งสองลึก แต่เข้าใจ: https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networkingและhttp://fabiensanglard.net/quake3/network.php
สิ่งเหล่านี้อธิบายว่าเหตุใดจึงแนะนำให้ใช้การส่งแพ็คเก็ตแบบ 'ช่วงเวลาแน่นอน' โดยย่อแล้วอันที่จริงแล้วมันสำคัญสำหรับแพ็คเก็ตที่ส่งโดยเซิร์ฟเวอร์
การส่งแพ็คเก็ตมีค่าใช้จ่ายคงที่และขนาดสูงสุดของแพ็กเก็ตเครือข่ายคือประมาณ 1.5 KB ดังนั้นหากคุณมีผู้เล่นตัวอย่าง 16 คนบนเซิร์ฟเวอร์ของคุณแต่ละเฟรมเมื่อคุณคำนวณการเคลื่อนที่ของผู้เล่นรหัสไร้เดียงสาสามารถส่งแพ็กเก็ตอัปเดตไปยังผู้เล่นแต่ละคนหลังจากความละเอียดการเคลื่อนไหวแต่ละครั้งดังนั้น 16 * 16 = 256 แพ็กเก็ต ถ้าคุณมีอัตรา 30 เป็น 7680 แพ็คเก็ต
วิธีที่ดีกว่าคือการสร้างบัฟเฟอร์ในแต่ละจุดเริ่มต้นของเฟรมต่อกันในตำแหน่งที่คำนวณได้ 16 ตำแหน่งของคุณจากนั้นส่งไปยังผู้เล่น 16 คนของคุณ
ตอนนี้คุณส่งเพียง 480 แพ็คเก็ตโดยวินาทีเพื่อผลลัพธ์เดียวกัน
ในกรณีที่ผู้เล่นไปถึงเซิร์ฟเวอร์นั่นหมายถึงคุณควรส่งข้อมูลสูงสุดเช่นเดียวกับในแพ็กเก็ตเดียวกัน ดูตำแหน่งการกระทำที่เรียกว่าเฟรมนี้และอื่น ๆ
เกี่ยวกับคำถามที่สองของคุณ - วิธีที่ฉันเลือกเพื่อลดความรู้สึกล้าหลังคือการส่งข้อมูลนี้ไปยังเซิร์ฟเวอร์ในแต่ละเฟรม:
ตำแหน่งปัจจุบันจริงของผู้เล่น (ใช้โดยเซิร์ฟเวอร์เพื่อตรวจสอบว่าตำแหน่งฝั่งเซิร์ฟเวอร์และฝั่งผู้เล่นไม่ถูกซิงโครไนซ์มากเกินไป)
ตำแหน่งผู้เล่นโดยประมาณใน 1 วินาที: คำนวณโดยไคลเอนต์: หากผู้เล่นไม่เปลี่ยนทิศทางของเมาส์และปล่อยให้แป้นพิมพ์อยู่ในสถานะปัจจุบันเป็นเวลา 1 วินาทีที่จะเป็นผู้เล่นหรือไม่? (เราไม่สนใจเรื่องการชน) หากผู้เล่นไม่เคลื่อนที่ตำแหน่งที่เขาคาดไว้ใน 1 วินาทีคือตำแหน่งปัจจุบัน
ตำแหน่งที่เขามอง
ทุกครั้งที่เซิร์ฟเวอร์ได้รับข้อมูลนี้เซิร์ฟเวอร์จะอัปเดตตำแหน่งในอนาคตและค้นหาตำแหน่งและเอนทิตีของผู้เล่นจะเลื่อนไปสู่ตำแหน่งในอนาคต
ผู้เล่นไม่ได้ทำการซิงโครไนซ์อย่างแน่นอน แต่การตอบสนองของอินพุตนั้นทันที (สำคัญที่สุดสำหรับฉัน) และฉันพบว่าตำแหน่งที่คาดการณ์มีความแม่นยำเพียงพอ