मैं अपनी नेटवर्किंग क्लास के लिए प्रोजेक्ट के रूप में एक साधारण क्लाइंट-सर्वर रियल-टाइम मल्टीप्लेयर गेम बनाना चाहता हूं।
मैंने वास्तविक समय मल्टीप्लेयर नेटवर्क मॉडल के बारे में बहुत कुछ पढ़ा है और मैं क्लाइंट और सर्वर और लैग-मुआवजा तकनीकों के बीच संबंधों को समझता हूं।
मैं जो करना चाहता हूं वह क्वेक 3 नेटवर्क मॉडल के समान है: मूल रूप से, सर्वर पूरे गेम स्थिति का एक स्नैपशॉट संग्रहीत करता है; ग्राहकों से इनपुट प्राप्त करने पर, सर्वर परिवर्तनों को दर्शाते हुए एक नया स्नैपशॉट बनाता है। फिर, यह नए स्नैपशॉट और पिछले एक के बीच के अंतरों की गणना करता है और उन्हें क्लाइंट को भेजता है, ताकि वे सिंक में हो सकें।
यह दृष्टिकोण मुझे वास्तव में ठोस लगता है - यदि क्लाइंट और सर्वर का एक स्थिर कनेक्शन है, तो उन्हें सिंक में रखने के लिए केवल न्यूनतम आवश्यक डेटा भेजा जाएगा। यदि क्लाइंट सिंक से बाहर हो जाता है, तो एक पूर्ण स्नैपशॉट भी अनुरोध किया जा सकता है।
हालाँकि, मैं स्नैपशॉट सिस्टम को लागू करने का एक अच्छा तरीका नहीं खोज सकता। मुझे एकल-खिलाड़ी प्रोग्रामिंग आर्किटेक्चर से दूर जाना वास्तव में कठिन लगता है और सोचता हूं कि मैं गेम स्टेट को इस तरह से कैसे स्टोर कर सकता हूं:
- सभी डेटा को तर्क से अलग किया गया है
- गेम स्टेट्स के स्नैपशॉट के बीच अंतर की गणना की जा सकती है
- खेल संस्थाओं को अभी भी आसानी से कोड के माध्यम से हेरफेर किया जा सकता है
एक स्नैपशॉट वर्ग कैसे लागू किया जाता है? संस्थाओं और उनके डेटा को कैसे संग्रहीत किया जाता है? क्या हर क्लाइंट इकाई के पास एक आईडी है जो सर्वर पर एक आईडी से मेल खाती है?
स्नैपशॉट अंतर की गणना कैसे की जाती है?
सामान्य तौर पर: एक गेम-स्टेट स्नैपशॉट सिस्टम कैसे लागू किया जाएगा?