คุณอนุญาตให้เขียนโค้ดระบบเครือข่ายในขั้นตอนต่อไปของการพัฒนาได้อย่างไร


12

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

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

แก้ไข:มีการวางแผนให้เป็นเกม RPG จากบนลงล่าง ผู้เล่นหลายคนง่ายๆที่คุณโฮสต์เซิร์ฟเวอร์สำหรับเพื่อนของคุณคือสิ่งที่ฉันกำลังคิดอยู่ดังนั้นการโกงจึงไม่เป็นปัญหามากนัก (ผู้ที่ต้องการเล่นกับเพื่อนโกง ยังฉันอยากจะไปกับ "เซิร์ฟเวอร์ที่ถูกต้องเสมอ" -approach

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


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

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

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

ถ้าคุณคิดว่ามัน Minecraft มีเซิร์ฟเวอร์ในพื้นที่แม้ในเกมผู้เล่นเดี่ยว เซิร์ฟเวอร์เป็นเอ็นจิ้นลูกค้าเป็นเพียงผู้นำเสนอ
SparK

คำตอบ:


12

โดยไม่ต้องรู้เพิ่มเติมเกี่ยวกับเกมที่คุณกำลังเขียนและวิธีที่คุณเขียนมันยากมากที่จะพูดวิธีแก้ปัญหาทั่วไปให้กับปัญหา

อย่างไรก็ตามคุณอาจต้องการพิจารณาการตัดสินใจครั้งนี้ว่าคุณจะทิ้งรหัสเครือข่ายไว้ท้ายที่สุดทั้งนี้ขึ้นอยู่กับว่าเครือข่ายสำคัญสำหรับเกมของคุณอย่างไร

สิ่งที่ฉันหมายถึงคือถ้าคุณเขียนเกมหนัก ๆ บนเครือข่ายเช่น MMORPG มันอาจไม่ฉลาดเลยที่จะต้องละทิ้งเครือข่ายไปจนจบ

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

จำไว้ว่า - การเขียน - รหัสเครือข่ายนั้นไม่เหมือนกับ -thinking- เกี่ยวกับมัน ในขณะที่คุณตัดสินใจเกี่ยวกับวิธีการสร้างเกมของคุณคุณควรพิจารณาว่าสิ่งนี้จะส่งผลต่อการตัดสินใจด้านเครือข่ายอย่างไรและหากผลกระทบที่คาดหวังสูงอาจนำไปใช้เป็น stub ที่ให้ข้อมูลทั่วไปและเมื่อถึงเวลาเขียนเครือข่าย รหัสมันเป็นเพียงเรื่องของการเสียบในที่ที่คุณทิ้งต้นขั้ว

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

เมื่อคุณสร้างเกมคุณจะรู้ว่าส่วนใดได้รับผลกระทบจากรหัสเครือข่ายและเมื่อถึงเวลาที่ต้องเขียนรหัสเครือข่ายคุณก็จะก้าวไปข้างหน้า

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

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


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

2
@Gork: อ่าคุณต้องการเห็นผลิตภัณฑ์ของคุณทำสิ่งที่สวยโดยเร็วที่สุด! ก็ใช่เราทุกคนทำ แต่การยอมจำนนต่อสิ่งล่อใจนั้นจะไม่นำไปสู่โปรแกรมที่ออกแบบมาอย่างดีและมีความคิดดี
การแข่งขัน Lightness ใน Orbit

ฉันจะยอมรับคำตอบนี้แม้ว่าฉันจะชอบคำตอบอื่น ๆ เช่นกัน เฉพาะความคิดเห็นโดย @Luaan
Ghork

2

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

วิธีการของฉันเป็นไปตามความคิดเห็นของคุณใน IPC (การสื่อสารระหว่างกระบวนการ)

ก่อนอื่นเป็นพื้นหลังฉันกำลังศึกษาหนังสือ "กราฟิกบนเครือข่าย" โดย Steed และ Oliveira สิ่งนี้จะให้ข้อมูลพื้นฐานที่ดีเกี่ยวกับสถาปัตยกรรมเครือข่ายที่หลากหลายสำหรับเกมขึ้นอยู่กับเกณฑ์และประเภทของเกม มันมีเครื่องมือที่จะช่วยคุณตัดสินใจสถาปัตยกรรมเกมของคุณและสิ่งที่คุณต้องการในเครือข่ายและสิ่งที่คุณต้องการให้เกิดขึ้นในพื้นที่

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

สิ่งนี้จะช่วยแยกตรรกะของคุณออกและช่วยให้คุณสามารถจำลองปัจจัยการหน่วงเวลาเครือข่ายในกระบวนการเพื่อให้คุณสามารถเห็นผลกระทบของเวลาแฝง


เดาฉันจะต้องตรวจสอบหนังสือเล่มนั้นออกมาแล้ว! ดูเหมือนว่าจะสามารถทำสิ่งที่คุณพูดได้
Ghork

@Ghork: กุญแจสำคัญคือการหาสถาปัตยกรรมของคุณสิ่งที่คุณต้องการในท้องถิ่นและสิ่งที่คุณต้องการบนเซิร์ฟเวอร์; หรือวิธีที่คุณต้องการให้เพื่อนสื่อสารและโต้ตอบ หนังสือเล่มนั้นน่าจะช่วยได้ จากนั้นใส่ทุกสิ่งที่คุณต้องการให้รีโมตอยู่อีกด้านหนึ่งของการโทรข้อความ IPC ผ่านชุดโค้ดไคลเอนต์ - เซิร์ฟเวอร์ซึ่ง (ตอนนี้) ทั้งหมดยังคงอยู่ในเครื่อง แต่เก็บสิ่ง "รีโมต" ไว้ในเธรดที่แยกจากกัน ในคอมโพเนนต์การส่งผ่านข้อความ IPC ให้เพิ่มเวลาแฝงที่คุณต้องการจำลอง โชคดี!
Joe Van Steen

1

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


0

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

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