सर्वर और क्लाइंट दोनों को एक ही प्रक्रिया में चलाना


9

सवाल

मैंने अभी पहली बार Lidgren और नेटवर्किंग के साथ काम करना शुरू किया है, और मुझे यह एहसास हुआ है कि सर्वर और क्लाइंट दोनों को एक ही प्रक्रिया में चलाना संभव है ।

क्या यह प्रथा किसी भी कारण से हतोत्साहित है?

प्रसंग

कारण मैं पूछ रहा हूँ क्योंकि मैंने यह समझा है कि यह अवधारणा मुझे सिंगलप्लेयर और मल्टीप्लेयर मोड दोनों को एक और एक ही मानने की अनुमति दे सकती है, जो बहुत सहायक होगी।

मेरे विचार की पंक्ति के बाद, यह वह वितरण है जो मेरे मन में था:

  • सिंगलप्लेयर - एक ही प्रक्रिया में 1 सर्वर + 1 क्लाइंट। संचार कितनी तेजी से कर रहे हैं?
  • मल्टीप्लेयर - मेजबान के लिए सिंगलप्लेयर के रूप में समान है + एक दूसरे खिलाड़ी के लिए 1 एडिशनल क्लाइंट ।

निष्पादन प्रवाह जो मैं चित्रित कर रहा हूं वह क्लाइंट के लिए उपयोगकर्ता इनपुट प्राप्त करने और सर्वर को एक अधिसूचना भेजने के लिए है। तब सर्वर इसे सत्यापित करता है, और सभी क्लाइंट द्वारा निष्पादित की जाने वाली कार्रवाई प्रसारित करता है। इससे कोई फर्क नहीं पड़ता कि केवल एक ग्राहक (यानी सिंगलप्लेयर) या कई क्लाइंट (यानी मल्टीप्लेयर) हैं।

जवाबों:


7

यह मूल रूप से एक प्रक्रिया बनाम थ्रेड प्रश्न है, दोनों बहुत अलग नहीं हैं, कभी-कभी थ्रेड को हल्के प्रक्रियाओं कहा जाता है। सबसे बड़ा अंतर यह है कि एक अलग प्रक्रिया में इसका स्वयं का पता स्थान होता है लेकिन अन्य अंतर हैं (1):

प्रति प्रक्रिया

  • पता स्थान
  • सार्वत्रिक चर
  • खुली फ़ाइलें
  • बाल प्रक्रिया
  • लंबित अलार्म, इंटरप्ट और सिग्नल हैंडलर

प्रति धागा

  • कार्यक्रम गणक
  • रजिस्टर
  • ढेर
  • राज्य

इन भिन्नताओं के आधार पर सर्वर और क्लाइंट थ्रेड को एक ही प्रक्रिया में रखना आसान हो सकता है ताकि आप फ़ाइल हैंडल और वैश्विक चर साझा कर सकें। यह 'एक ही प्रक्रिया' दृष्टिकोण के लिए एक तर्क होगा, एक और (छोटा) तर्क यह होगा कि आपको प्रति प्रक्रिया केवल एक 'विंडोज फ़ायरवॉल' पॉप-अप मिलता है। 'अलग प्रक्रिया' दृष्टिकोण के लिए एक तर्क यह होगा कि एक व्यक्ति कई क्लाइंट को चलाने के बिना कई सर्वर चला सकता है। यह सेट-अप की तरह एक समर्पित मेजबान के लिए आदर्श होगा और एक दृष्टिकोण है जिसे हम आमतौर पर पहले व्यक्ति निशानेबाजों में देखते हैं।

अब के रूप में विचार के लिए एक सर्वर प्रक्रिया या थ्रेड-लाइन खेलने के लिए धागा (और शायद एकल-खिलाड़ी के लिए भी) यह एक महान विचार है जो व्यवहार में बहुत उपयोग किया जाता है। आप लोडिंग स्क्रीन को देखकर बहुत सारे गेम कर सकते हैं, 'प्राप्त' जैसे छोटे संकेत इसे दूर कर देंगे। ऐसा करना तर्कसंगत है क्योंकि यदि आप एक मल्टी-प्लेयर बनाने जा रहे हैं तो अधिकांश गेम नियमों को सर्वर द्वारा नियंत्रित किया जाएगा, तो इसने उन्हें एकल-खिलाड़ी के लिए नियंत्रित क्यों नहीं किया है? यह आपके द्वारा लिखे गए कोड को कम कर देता है और क्लाइंट और 'गेम' के बीच एक स्पष्ट अलगाव देता है जो आपके कोड की गुणवत्ता में सुधार करेगा।

अब प्रक्रियाओं और धागों के बीच संवाद कैसे हो? क्रॉस प्रोसेस कम्युनिकेशन बहुत तरीकों से किया जा सकता है, (नाम-) पाइप, साझा मेमोरी, COM, यह वास्तव में आपके द्वारा उपयोग की जाने वाली तकनीक पर निर्भर करता है। हालाँकि, यदि आप एक सर्वर बना रहे हैं, तो आप संभवतः सॉकेट और टीसीपी की पसंद का उपयोग करके एक नेटवर्किंग संस्करण के साथ जाना चाहेंगे, यह निश्चित रूप से है जहां LIDGREN काम में आएगा।

इनमें से बहुत सी तकनीकें क्रॉस थ्रेड कम्युनिकेशन के लिए भी मान्य हैं। लेकिन यह आपके द्वारा उपयोग की जा रही तकनीकों पर और भी अधिक निर्भर करता है। आप फिर से टीसीपी के साथ जा सकते हैं, लेकिन शायद एक सरल प्रणाली भी इवेंट और कुछ मार्शलिंग होगी, हालांकि यह आपके गेम लूप को निर्धारक (2) बना सकता है।

सूत्रों का कहना है

  1. ऑपरेटिंग सिस्टम डिजाइन और कार्यान्वयन (MINIX पुस्तक), एंड्रयू एस। टेनबाम द्वारा तीसरा संस्करण
  2. ग्लेन फिडलर द्वारा अपना टाइमस्टेप ठीक करें: http://gafferongames.com/game-physics/fix-your-timestep/

1
मेरा एकमात्र जोड़ यह है कि यदि आप दूरस्थ क्लाइंट के समान कोड का उपयोग करके स्थानीय सर्वर के साथ स्थानीय क्लाइंट का काम करना चाहते हैं, और आप चाहते हैं कि यह क्लाइंट उसी कोड का उपयोग करने के लिए फिर से रिमोट सर्वर से कनेक्ट हो जो आप जा रहे हैं 1) सर्वर के लिए एक प्रक्रिया का उपयोग करें, और 2) नेटवर्किंग का उपयोग करें क्योंकि यह आम भाजक है। जब तक आप अपने परिवहन कोड के दो संस्करणों को लिखने का मन नहीं करते, वैसे भी =)
पैट्रिक ह्यूजेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.