C # ทำงานได้กับเซิร์ฟเวอร์เกมแบบเรียลไทม์หรือไม่? [ปิด]


22

คำถามส่วนใหญ่อยู่ในชื่อเรื่อง

โดยพื้นฐานแล้วฉันเริ่มพัฒนาเกมแอ็คชั่น 2D แบบผู้เล่นหลายคน ไคลเอนต์ (อาจ) จะอยู่ใน XNA และฉันคิดว่าฉันถามที่นี่ว่าเป็นความคิดที่ดีที่จะใช้ C # สำหรับการพัฒนาฝั่งเซิร์ฟเวอร์เช่นกัน

ฉันเดาความจริงที่ว่าภาษานั้นได้รับการจัดการไม่ใช่ปัญหาเนื่องจาก Java ถูกใช้ในเซิร์ฟเวอร์เกม MMO (แก้ไขให้ถูกต้องถ้าฉันผิด) ดังนั้นมีเหตุผลใดที่จะหลีกเลี่ยง C # สำหรับจุดประสงค์นี้ ฉันต้องการให้รวดเร็วและตอบสนองการสื่อสารผ่าน TCP เพื่อแชทกับเซิร์ฟเวอร์ SQL และถ้าไม่มีเหตุผลที่จะหลีกเลี่ยง C # ฉันจะปรับใช้เว็บเซิร์ฟเวอร์เช่นนี้ได้หรือไม่จะเป็น. NET EXE ที่ทำงานบนเครื่องเซิร์ฟเวอร์


2
คุณถูกต้องเกี่ยวกับเซิร์ฟเวอร์ Java MMO
Ricket

คำตอบ:


22

ไม่ใช่แค่ทำงานได้ แต่ดีจริงๆในประสบการณ์ของฉัน ฉันได้พัฒนาเซิร์ฟเวอร์ MMO หลายเครื่องโดยใช้ C # และต้องบอกว่าฉันไม่เคยเสียใจที่เลือกภาษาและแพลตฟอร์ม

มีไลบรารีและเครื่องมือที่ยอดเยี่ยมมากมายสำหรับ C # และ. NET โดยทั่วไป - เครือข่ายการบันทึกการทำแผนที่ O / R เป็นต้นและเมื่อเทียบกับ Java C # นั้นมีความชัดเจนและ verbose น้อยกว่า (บางคนอาจโต้แย้งเกี่ยวกับเรื่องนี้ )

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

เป็นตัวอย่างของความยอดเยี่ยมของ C # นี่คือสิ่งที่เราเพิ่งนำมาใช้ เซิร์ฟเวอร์ของเราให้บริการ WCF หลายอย่างที่ไคลเอนต์เกมใช้สำหรับงานที่ไม่สำคัญและเรายังใช้บริการเหล่านี้เพื่อการดูแลเซิร์ฟเวอร์ มันกลับกลายเป็นว่าง่ายมากที่จะให้บริการ WCF เพียงแค่คืนค่าวัตถุเกมของเราไปยังผู้โทร ดังนั้นเราจึงทำเช่นนั้นทำปลั๊กอินเล็กน้อยไปที่ LINQPad ที่เชื่อมต่อกับเซิร์ฟเวอร์ของเรา - และตอนนี้เราสามารถเรียกใช้แบบสอบถามได้

from character in Service.GetOnlineCharacters()
where character.LocationManager.LocationId==5 && character.Attributes.Level<10
select new { character.Id, character.Nick }

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


ฉันชอบการใช้ LINQ โดยเฉพาะอย่างยิ่งสิ่งนี้ทำให้เซิร์ฟเวอร์พัฒนาง่ายขึ้นและเร็วขึ้นมาก
โทมัส

26

แน่นอนว่าคุณสามารถใช้ C #

หนึ่งในปัญหาที่ใหญ่กว่าที่ต้องระวังในแง่ของประสิทธิภาพใน C # หรือระบบนิเวศ. NET อื่น ๆ คือ GC - . NET Framework ให้รสชาติที่หลากหลายของ GCรวมถึง "เซิร์ฟเวอร์" ที่ควรค่าแก่การเรียนรู้ การจัดการหน่วยความจำอย่างชาญฉลาด (เช่นการรวมกำไร) ยังคงเป็นเทคนิคที่ดีแม้ในสภาพแวดล้อมที่มีการจัดการ

มี API ที่แข็งแกร่งหลายตัวสำหรับการโต้ตอบกับ SQL การสื่อสารผ่าน TCP และอื่น ๆ ใน C # ไม่ว่าจะเป็นส่วนหนึ่งของเฟรมเวิร์กพื้นฐานหรือผ่านบุคคลที่สามดังนั้นคุณไม่ควรมีปัญหา

คุณสามารถใช้ ASP.NET หรือคล้ายกันได้หากคุณต้องการให้เซิร์ฟเวอร์ของคุณทำงานบนเว็บ หากคุณเพียงแค่ต้องการเรียกใช้กระบวนการและฟังการเชื่อมต่อ TCP คุณสามารถปรับใช้. exe และการพึ่งพาที่เหมาะสมกับเครื่องเซิร์ฟเวอร์เปิดพอร์ตที่เหมาะสมและเรียกใช้. exe


5

ฉันคิดว่ามันเป็นความคิดที่ดี ภาษามีความสามารถอย่างแน่นอนและโดยเฉพาะอย่างยิ่งถ้าเป็นสิ่งที่คุณรู้อย่าใช้เวลาในการเรียนรู้ภาษาใหม่เพียงเพราะมัน "เร็ว" คอขวดที่แท้จริงของเซิร์ฟเวอร์ของคุณจะเป็นเครือข่ายแฝง มิลลิวินาทีพิเศษหรือสองเพราะคุณใช้ C # แทน C ++ จะไม่สร้างความแตกต่าง


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

3

หากคุณสามารถปรับใช้กับ Windows ได้ฉันขอแนะนำอย่างยิ่งโดยเฉพาะอย่างยิ่งเนื่องจากไคลเอ็นต์ของคุณคือ C #

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

ในฐานะที่เป็นจุดเริ่มต้นฉันอยากให้คุณดูที่หน้านี้ซึ่งอธิบายวิธีการเขียนโปรแกรมซ็อกเก็ตพร้อมกันในวงกว้างในหลายแพลตฟอร์ม:

http://geekswithblogs.net/quension/archive/2006/06/30/83760.aspx

หากคุณจริงจังกับเรื่องนี้มากฉันขอแนะนำให้คุณศึกษาโปรแกรมเครือข่าย Unix ของ Stevens อย่างละเอียด มันเน้นไปที่ซ็อกเก็ต C บน Unix แต่หลักการนั้นเหมือนกันสำหรับแพลตฟอร์มอื่น ๆ รวมถึง. net

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

http://replay.waybackmachine.org/20080405220143/http://www.coversant.net/dotnetnuke/Coversant/Blogs/tabid/88/EntryID/10/Default.aspx


1

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


อย่าลืมว่าสามารถใช้ MONO เพื่อปรับใช้กับแพลตฟอร์มอื่นได้ ฉันเชื่อว่า Second Life ใช้วิธีการนี้ - สคริปต์เกมภายในของพวกเขาได้รับการคอมไพล์ไปยัง. NET IL จริง ๆ
ShadowChaser
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.