การรันทั้งเซิร์ฟเวอร์และไคลเอนต์ภายในกระบวนการเดียวกัน


9

คำถาม

ฉันเพิ่งเริ่มทำงานกับLidgrenและระบบเครือข่ายเป็นครั้งแรกและฉันได้ตระหนักว่ามันเป็นไปได้ที่จะเรียกใช้ทั้งเซิร์ฟเวอร์และไคลเอนต์ภายในกระบวนการเดียวกัน

การฝึกฝนนี้ไม่สนับสนุนด้วยเหตุผลใด ๆ หรือไม่?

บริบท

เหตุผลที่ฉันถามก็เพราะฉันคิดว่าทฤษฎีนี้อาจทำให้ฉันสามารถเล่นทั้งโหมดผู้เล่นคนเดียวและโหมดผู้เล่นหลายคนในแบบเดียวและแบบเดียวกันซึ่งจะเป็นประโยชน์อย่างมาก

ตามแนวความคิดของฉันนี่คือการแจกแจงที่ฉันมีอยู่ในใจ:

  • Singleplayer - 1 เซิร์ฟเวอร์ + 1 ไคลเอนต์ในกระบวนการเดียวกัน การสื่อสารมีความเร็วแค่ไหน?
  • Multiplayer - เหมือนกับ singleplayer สำหรับโฮสต์ + 1 aditional client สำหรับผู้เล่นอื่น

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

คำตอบ:


7

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

ต่อกระบวนการ

  • พื้นที่ที่อยู่
  • ตัวแปรทั่วโลก
  • เปิดไฟล์
  • กระบวนการลูก
  • สัญญาณเตือนที่ค้างอยู่อินเตอร์รัปต์และตัวจัดการสัญญาณ

ต่อกระทู้

  • โปรแกรมนับ
  • ลงทะเบียน
  • ซ้อนกัน
  • สถานะ

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

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

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

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

แหล่งที่มา

  1. การออกแบบและการใช้งานระบบปฏิบัติการ (หนังสือ MINIX) ฉบับที่ 3 โดย Andrew S. Tanenbaum
  2. แก้ไขการประทับเวลาของคุณโดย Glenn Fiedler: http://gafferongames.com/game-physics/fix-your-timestep/

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