क्वेक 3 सोर्स कोड रिव्यू: आर्किटेक्चर (भाग 1)

चूंकि मेरे अगले अनुबंध से एक सप्ताह पहले, मैंने अपना आईडी लेख चक्र समाप्त करने का फैसला किया। Doom , Doom Iphone , Quake1 , Quake2 , Wolfenstein iPhone और Doom3 के बाद , मैंने अध्ययन कोड का फैसला किया जिसकी मैंने अभी तक समीक्षा नहीं की थी: idTech3 - 3D Quake III इंजन और क्वेक लाइव।

इंजन अनिवार्य रूप से एक बेहतर idTech2 है, लेकिन कुछ दिलचस्प संवर्द्धन हैं। मुख्य बिंदुओं में निम्नलिखित परिणाम हो सकते हैं:

• भाग 2: शेड्स के आधार पर सामग्री के साथ एक दोहरे कोर विज़ुअलाइज़ेशन उपकरण (OpenGL फिक्स्ड पाइपलाइन के माध्यम से बनाया गया)
• भाग 3: स्नैपशॉट पर आधारित नया नेटवर्क मॉडल
• भाग 4: Quake1 गतिशीलता / सुरक्षा और Quake2 गति के संयोजन में आभासी मशीनें इंजन में एक प्रमुख भूमिका निभाती हैं
• भाग 5: बॉट्स के लिए एक नई कृत्रिम बुद्धि।
मैं विशेष रूप से प्रभावित था:

• वर्चुअल मशीन और संबंधित उपकरणों की एक प्रणाली, जो आमतौर पर 30% कोड बनाती है। इस दृष्टिकोण से, idTech3 एक मिनी-ऑपरेटिंग सिस्टम है जो तीन प्रक्रियाओं की प्रणाली कॉल प्रदान करता है।
• छवियों और स्मृति के आत्म-विश्लेषण पर आधारित एक सुरुचिपूर्ण नेटवर्क प्रणाली।

हमेशा की तरह, मैंने बहुत सारे नोट लिखे, जिन्हें मैंने क्रम में रखा और डिज़ाइन किया। मुझे उम्मीद है कि यह कुछ लोगों के लिए समय बचाता है और दूसरों को अधिक कोड सीखने और बेहतर इंजीनियर बनने के लिए प्रोत्साहित करता है।

पहले संपर्क करें


चूंकि आदरणीय ftp.idsoftware.com को हाल ही में बंद कर दिया गया है, आप आईडी सॉफ्टवेयर के GitHub खाते पर कोड पा सकते हैं।

git clone https://github.com/id-Software/Quake-III-Arena.git 

जब एक बड़ी परियोजना का अध्ययन करने का समय आता है, तो मैं Xcode का उपयोग करना पसंद करता हूं: परिभाषाओं और स्ट्रिंग हाइलाइटिंग को खोजने के लिए क्विक हाइलाइटिंग, कीबोर्ड शॉर्टकट उपकरण को विज़ुअलस्टडियो की तुलना में अधिक शक्तिशाली बनाते हैं। लेकिन Quake3 के साथ एक परियोजना खोलने से पता चला कि Xcode 4.0 एक Xcode 2.0 परियोजना नहीं खोल सकता है।
अंत में, मैंने विंडोज 8 पर विजुअल स्टूडियो 2010 प्रोफेशनल का उपयोग करने का फैसला किया। विजुअल स्टूडियो के लिए प्रोडक्टिविटी पावर टूल्स स्थापित करने के बाद, यह काम करने के लिए अधिक सुखद हो गया।
विजुअल स्टूडियो में मुझे जो पहली चीज़ लगी, वह यह थी कि यह 8. खोला गया। एक प्रोजेक्ट के बजाय, सभी का उपयोग नहीं किया जाता है, विधानसभा के प्रकार पर निर्भर करता है: DEBUG या RELEASE (विशेष रूप से, गेम, cgame और q3_ui: वर्चुअल प्रोजेक्ट प्रोजेक्ट)। कुछ परियोजनाओं का उपयोग बिल्कुल नहीं किया जाता है (स्प्लिन और यूआई)।
तालिका बेहतर दिखाती है कि कौन सा प्रोजेक्ट किस मॉड्यूल को प्रभावित करता है:
परियोजनाओंटाइपDEBUG बनाता हैकृपया बनाएँटिप्पणियाँ
botlibस्थैतिक पुस्तकालयbotlib.libbotlib.lib
cgameडायनेमिक लाइब्रेरी / बायटेकोडcgamex86.dll-
खेलडायनेमिक लाइब्रेरी / बायटेकोडqagamex86.dll-
q3_uiडायनेमिक लाइब्रेरी / बायटेकोडuix86.dll-
quake3निष्पादनquake3.exequake3.exe
रेंडररस्थैतिक पुस्तकालयrenderer.librenderer.libOpengl आधारित
splinesस्थैतिक पुस्तकालयSplines.libSplines.libअब इस्तेमाल किया!
uiडायनेमिक लाइब्रेरी / बायटेकोडuix86_new.dll-क्वेक III एरिना के लिए प्रयुक्त।

एक छोटा विषयांतर: idTech3 का कार्य नाम "ट्रिनिटी" था। चूंकि idTech4 को "नियो" कहा जाता था, मुझे लगा कि यह फिल्म "द मैट्रिक्स" से संबंधित है ... लेकिन आईडी सॉफ्टवेयर ने firingsquad.com के साथ एक साक्षात्कार में दावा किया कि इसका नाम "ट्रिनिटी रिवर इन डलास" इंजन रखा गया था।

आर्किटेक्चर


आर्किटेक्चर को समझने का एक सुविधाजनक तरीका: आपको पहले सॉफ़्टवेयर को इनपुट सिग्नल (शीर्ष बाईं ओर तीर) और आउटपुट उत्पन्न करने वाले (नीचे तीर) पर ब्लैक बॉक्स के रूप में विचार करना चाहिए:



अब 6 मॉड्यूल (quake3.exe, रेंडरर.लिब, bot.lib, गेम, cgame और q3_ui) के साथ आंतरिक संरचना को सफेद बॉक्स के रूप में देखते हैं:



आपको परियोजना में 2 महत्वपूर्ण बातें समझने की जरूरत है:

• प्रत्येक इनपुट सिग्नल (कीबोर्ड, win32 संदेश, माउस, यूडीपी सॉकेट) को Event_t में बदल दिया जाता है और एक केंद्रीकृत घटना कतार (sysEvent_t eventQue [256]) में रखा जाता है। यह आपको प्रत्येक प्रभाव को रिकॉर्ड करने (लॉग रखने) की अनुमति देता है, फिर त्रुटियों को फिर से बनाने के लिए। इस डिजाइन निर्णय पर 14 अक्टूबर, 1998 को जॉन कार्मैक द्वारा .plan में विस्तार से चर्चा की गई थी।

• क्लाइंट और सर्वर के स्पष्ट अलगाव (यह प्रश्नोत्तर में उल्लिखित था, जो मैंने जॉन कार्मैक के साथ किया था।

- सर्वर का हिस्सा खेल की स्थिति को बनाए रखने के लिए ज़िम्मेदार होता है, यह निर्धारित करता है कि क्लाइंट को क्या चाहिए और उन्हें नेटवर्क पर कनेक्ट करना चाहिए। यह वैधानिक रूप से bot.lib से जुड़ता है, जो इसके अराजक विकास इतिहास के कारण एक अलग परियोजना है।

- क्लाइंट भाग यह अनुमान लगाने के लिए ज़िम्मेदार है कि ऑब्जेक्ट कहाँ स्थित हैं (देरी के लिए क्षतिपूर्ति करने के लिए) और छवि प्रदान करना। यह सांख्यिकीय रूप से एक प्रतिपादन परियोजना से जुड़ता है: एक अलग परियोजना जो Direct3D या यहां तक ​​कि सॉफ्टवेयर को चालू करने की अनुमति देती है, बहुत सरल है।

कोड


एक कोड बिंदु से, यहाँ एक आंशिक रूप से तैनात चक्र है जो संसाधित और प्रेषण क्लाइंट और सर्वर घटनाओं को दिखाता है:

 int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { Com_Init NET_Init while( 1 ) { //   IN_Frame() //  Win32      event_t     { IN_JoyMove IN_ActivateMouse IN_MouseMove } Com_Frame { //   Com_EventLoop // Pump win32 message, UDP socket and console commands to the queue // (sysEvent_t eventQue[256]) Cbuf_Execute //   SV_Frame { SV_BotFrame //   bot.lib VM_Call( gvm, GAME_RUN_FRAME, svs.time ) //   VM ,   //   SV_CheckTimeouts SV_SendClientMessages //      //   } // Common code Com_EventLoop Cbuf_Execute // Client code CL_Frame { CL_SendCmd //      //     SCR_UpdateScreen VM_Call( cgvm, CG_DRAW_ACTIVE_FRAME); //   //   VM (do Predictions). or VM_Call( uivm, UI_DRAW_CONNECT_SCREEN); //   ,   S_Update //    } } } } 


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

1. Quake3.exe एक क्लाइंट VM संदेश भेजता है: CG_DRAW_ACTIVE_FRAME, जो संकेत देता है कि अपडेट की आवश्यकता है।
2. वर्चुअल मशीन एक ऑब्जेक्ट का चयन करती है और एक भविष्यवाणी करती है, फिर OpenGL को Quake3 सिस्टम कॉल (CG_R_RENDERSCENE) के माध्यम से बुलाया जाता है।
3. Quake3.exe एक सिस्टम कॉल प्राप्त करता है और वास्तव में RE_RenderScene कहता है।



आंकड़े


यहाँ क्लॉक के कुछ आंकड़े दिए गए हैं:



पाई चार्ट स्पष्ट रूप से दिखाता है कि अनुपात कितने असामान्य हैं, क्योंकि कोड का 30% उपकरण द्वारा कब्जा कर लिया गया है।

यह आंशिक रूप से है क्योंकि idtech3 एएनएसआई सी संकलक सुविधाओं को लागू करता है: लिटिल सी कंपाइलर (एलसीसी) एक खुला स्रोत कोड है जिसका उपयोग वर्चुअल मशीनों के लिए बायटेकोड उत्पन्न करने के लिए किया जाता है।

मेमोरी आवंटन


दो पारंपरिक आवंटनकर्ता यहां उपयोग किए गए थे:
ज़ोन एलोकेटर: रन- टाइम, छोटी और अल्पकालिक मेमोरी आवंटित करना
हंक एलोकेटर: स्तर लोडिंग, मेमोरी के बड़े और दीर्घकालिक आवंटन के दौरान काम करता है जिसमें पाक फ़ाइलों की सामग्री लोड की जाती है (ज्यामिति, नक्शे, बनावट, एनीमेशन)।

मैं पढ़ने की सलाह देता हूं


क्वेक के इतिहास के अनुसार - कयामत के परास्नातक।
बेहतर आभासी मशीनों को समझने के लिए दो सर्वश्रेष्ठ संकलक किताबें।
एलसीसी इंटरमीडिएट रिप्रेजेंटेशन को समझने के लिए एक लेख।



Source: https://habr.com/ru/post/In170139/


All Articles