लुआ को सी ++ गेम में शामिल करने के क्या नियम और विपक्ष हैं?


37

मेरे पास C ++ गेम प्रोग्रामिंग बुक है और इसमें एक Lua सेक्शन है। मैंने लुआ अनुभाग को पढ़ना शुरू कर दिया है, और यह दिलचस्प लगता है, लेकिन मैं अपने सी ++ गेम में लुआ का उपयोग करने के पेशेवरों और विपक्षों को निर्धारित नहीं कर सकता। एकमात्र लाभ जो मैं वर्तमान में सोच सकता हूं, वह यह है कि आप recompile किए बिना, Lua के माध्यम से कुछ कोडिंग अपडेट कर सकते हैं। इसके अलावा, मैं कुछ भी नहीं सोच सकता। तो Lua को C ++ गेम में जोड़ने के पेशेवरों और विपक्ष क्या हैं?

उदाहरण की सराहना की जाएगी।




सहमत हूं कि यह उन सवालों के समान है, लेकिन यहां 'कॉन्स' महत्वपूर्ण है।
जोनाथन डिकिंसन

@JonathanDickinson जवाब उस दिशा में इंगित नहीं करता है, हालांकि ... वे मूल रूप से लिंक किए गए प्रश्न के समान हैं।
bummzack

जवाबों:


33

एकमात्र लाभ जो मैं वर्तमान में सोच सकता हूं, वह यह है कि आप recompile किए बिना, Lua के माध्यम से कुछ कोडिंग अपडेट कर सकते हैं।

इस की उपयोगिता को इतनी आसानी से छूट न दें। आप कभी भी यह नहीं समझ पाएंगे कि जब तक आप पुनर्मूल्यांकन कदम नहीं उठाते हैं तब तक आप कितने उत्पादक होंगे।

"प्रवाह" जब यह काम करने के लिए आता एक काफी अच्छी तरह से समझा मनोवैज्ञानिक अवधारणा है। प्रवाह यह है कि आप महसूस कर रहे हैं जब आप एक गतिविधि पर ध्यान केंद्रित कर रहे हैं, जब आप विश्लेषण कर रहे हैं और समस्याओं को लगभग बिना सोचे समझे हल कर रहे हैं, आदि "जब आप बह रहे हैं" तो आप अपने सबसे अधिक उत्पादक हैं।

संकलित समय सभी को खराब कर देता है। यदि आपके पास कुछ परीक्षण करने के लिए 10 सेकंड का संकलन है, तो प्रवाह में रहना मुश्किल है।

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

लुआ (या कोई भी एम्बेडेड स्क्रिप्टिंग भाषा) आपको केवल "संकलन" के बिना, बदलाव का परीक्षण करने की अनुमति देता है, लेकिन खेल में रहते हैं । आप अपने गेम का निर्माण कैसे करते हैं, इसके आधार पर, आप एक कमांड चला सकते हैं, जो गेम को रोकने और डेटा को फिर से लोड किए बिना नई स्क्रिप्ट के साथ पुनः आरंभ करेगा। इतना ही नहीं आपको recompile नहीं करना है, आपको re-run नहीं करना है।

ऐसा करने की क्षमता, उचित इंजन समर्थन को देखते हुए, नाटकीय रूप से उत्पादकता बढ़ा सकती है।


स्क्रिप्टिंग का एक और बड़ा फायदा सिर्फ देखभाल न करने की क्षमता है। यदि आपने C ++ लिखने में लंबा समय बिताया है, तो आप आश्चर्यचकित होंगे कि आप कितने समय के लिए मिनुते पर खर्च करते हैं। जहां मेमोरी डिलीट हो जाती है। जहां यह मुक्त हो जाता है। यहां तक ​​कि अगर आप shared_ptrहर जगह उपयोग कर रहे हैं , तो बस उन सभी प्रकार के नामों में टाइप करने का कार्य आपको धीमा कर देता है।

गतिशील रूप से टाइप की गई स्क्रिप्टिंग भाषा में, आपको ध्यान रखने की आवश्यकता नहीं है। स्कोपिंग सरल है। कार्य प्रथम श्रेणी की वस्तुएं हैं; आपको मैन्युअल रूप से फ़ंक्शंस बनाने की ज़रूरत नहीं है। कुछ चीजें करना इतना आसान है।

यदि आपके पास एक अनुशासित प्रोग्रामर नहीं है, तो अब नकारात्मक बातें हैं। Lua में ग्लोबल्स का उपयोग करना बहुत आसान है (हालांकि इसे रोकने के तरीके हैं)। देखभाल न करने का मतलब है कि जब आप कोड करते हैं तो आप बहुत मैला हो सकते हैं।

लेकिन फिर, बहुत मैला होने से फायदे हो सकते हैं


लुआ की एक और बात यह है कि यह एक अच्छा डेटा विवरण भाषा बनाता है। JSON की तरह ही एक जावास्क्रिप्ट फ़ाइल है जो एक सरणी / तालिका बनाता है और रिटर्न करता है, आप Lua स्क्रिप्ट बना सकते हैं जो टेबल लौटाते हैं।

यह कॉन्फ़िगरेशन फ़ाइलों के लिए उपयोगी है; लुआ का टेबल फॉर्मेट .ini प्रारूपों की तुलना में काफी बेहतर है। प्रारूप अभी भी स्वच्छ, कॉम्पैक्ट, और एक्स्टेंसिबल है।

ओह, और यह अभी भी एक लुआ स्क्रिप्ट है, इसलिए यह वास्तविक तर्क प्रदर्शन कर सकता है। इसका नकारात्मक पक्ष यह है ... ठीक है, यह एक लुआ स्क्रिप्ट है, इसलिए यह वास्तविक तर्क प्रदर्शन कर सकता है । यह खेल में विनाशकारी हो सकता है, क्योंकि उपयोगकर्ता संभावित रूप से चीजों को खराब करना शुरू कर सकता है।

लेकिन वास्तव में, यह आसानी से निपटा जाता है। लुआ को एम्बेडिंग के लिए डिज़ाइन किया गया है, जिसका अर्थ है कि अलगाव वास्तव में काफी आसान है। वास्तव में, एक ताजा लुआ राज्य डिफ़ॉल्ट रूप से कुछ भी नहीं प्रदान करता है ; आपको वास्तव में मानक लुआ पुस्तकालयों के सबसे मूल को उजागर करने के लिए कुछ करना होगा। फ़ाइल एक्सेस, गेम-स्टेट एक्सेस आदि, सभी ऑप्ट-इन है, ऑप्ट-आउट नहीं। और प्रत्येक लुआ राज्य एक दूसरे से अलग होता है। एआई स्क्रिप्ट के लिए आपके द्वारा उपयोग किया जाने वाला लुआ राज्य आपके द्वारा कॉन्फ़िगर की गई फ़ाइलों के लिए उपयोग किए जाने वाला लुआ राज्य नहीं होता है।

मेरे पास वास्तव में कुछ कोड हैं जो आपको कई Lua मानक पुस्तकालयों को पंजीकृत करने की अनुमति देता है, लेकिन सभी फ़ाइल IO को पार करता है और हटाता है। अंततः, एक लुआ लिपि-आधारित कॉन्फ़िगरेशन फ़ाइल जो सबसे खराब हो सकती है, वह आपके गेम को तुरंत चलाने के कारण क्रैश कर सकती है, इसे मेमोरी से बाहर चलाकर। और जब से आप इन कॉन्फ़िगर फ़ाइलों को मैन्युअल रूप से साझा नहीं कर रहे हैं, तो यह एक हैकर के लिए बहुत मजेदार नहीं होगा।


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

या आप "प्रिंटफ डीबगिंग" के कारण बना सकते हैं। यह वास्तव में इस बात पर निर्भर करता है कि आप कितना लुआ कोड लिखते हैं।


1
बहना हमेशा अच्छी बात नहीं होती है; चीजों को स्वचालित रूप से करने का मतलब कभी-कभी डिजाइन विकल्पों पर चलने में समय नहीं लगता है।
लूर्शर

10
@lurscher: कोड के लिए बैठने से पहले डिज़ाइन वह है जो आप करते हैं । आपको अपना कोड लिखने, परीक्षण करने और डीबग करने से पहले उन सभी डिज़ाइन विकल्पों पर काम करना चाहिए था।
निकोल बोलस

23

जहाँ मैं काम करता हूँ:

पेशेवरों:

  • पुनरावृत्ति समय में सुधार। हमारा गेम परिवर्तनों के लिए एक मेजबान फाइलसिस्टम को चुनने और परिवर्तनों में स्वचालित रूप से "स्लरप" स्थापित करने के लिए स्थापित है। (वे केवल अगली फ़ाइल खोलने पर प्रभावी होते हैं, लेकिन व्यवहार में, यह एक बड़ा सुधार है: स्तर को फिर से लोड करना, और आपके नए लुआ परिवर्तन तुरंत आते हैं।)
  • कंसोल एकीकरण । किसी भी डीबग कार्यक्षमता को एक REPL के साथ एक पारंपरिक क्वेक-शैली कंसोल से जोड़ा जा सकता है। आंतरिक बिल्ड के लिए हम एक सरल सॉकेट को एक लुआ आरईपीएल को हुक कर सकते हैं जो टेलनेट बोलता है, और हमारे खेल पर हमारा नेटवर्क नियंत्रण है।
  • कम एपीआई और कम सीखने की अवस्था । गैर-कलाकार कलाकार और डिज़ाइनर कुछ ऐसे कार्यों में शामिल हो सकते हैं जो आमतौर पर प्रोग्रामर-टोंटीदार होते हैं।
  • विशेष स्थिर कोड विश्लेषणluac -lकुछ विश्लेषण करने के लिए बाइटकोड पर उत्पादन और झांकना आसान है ; अधिकांश लुआ स्रोत फ़ाइलों को पार्स करना भी बहुत आसान है, खासकर यदि आपके पास एक कोडिंग सम्मेलन है। हम स्थानीय सम्मेलन लागू कर सकते हैं। आप यहां और भी अधिक शक्ति के लिए मेटलुआ में देख सकते हैं।
  • त्रुटि से निपटने । अगर हमारा API क्रैश-फ्री है, भले ही लुआ कुछ मूर्खतापूर्ण है, हम इसे पकड़ सकते हैं और उपयोग करके पुनर्प्राप्त कर सकते हैं lua_pcall
  • आसान एपीआई विस्तार । Lua के लिए एक नया फ़ंक्शन लिखना <-> C ++ API बहुत कठिन नहीं है। ऐसे पैकेज भी हैं जो इसे स्वचालित करने में मदद करेंगे।
  • सरल स्रोत । उदाहरण के लिए परिवर्तन करना लावा दुभाषिया (कुछ एम्बेडेड प्लेटफार्मों पर महत्वपूर्ण) में फ्लोटिंग पॉइंट गणित से बचने के लिए या विशेष प्रणालियों के लिए अनुकूलन करना बहुत मुश्किल नहीं है!
  • मेटाटैबल्स । ये कमाल के हैं। रनटाइम में दिलचस्प चीजें करने की इतनी क्षमता। हमारे पास "वर्चुअल टेबल" है, जिसमें वास्तव में कोई सामग्री नहीं है और हमारे गेम्स के सी ++ की तरफ एक जटिल डेटा संरचना में एक लुकअप करते हैं।
  • धनिया । उदाहरण के एआई व्यवहार स्क्रिप्ट को रोकने और फिर से शुरू करने में सक्षम होना अद्भुत है। यह लुआ ट्रूकॉलर के हिस्से पर थोड़ा अधिक समझ में आता है, हालांकि - हम अभी भी इस पर काम कर रहे हैं कि यह हमारे इंजन के लिए "अधिक" कैसे सुरक्षित है।

विपक्ष:

  • अप्रत्याशित जीसी । ट्यूनिंग क्या हमारे stepप्रति खेल में काफी बदलाव होना चाहिए। कुछ पूर्ण जीसी हर फ्रेम (छोटे कामकाजी सेट) के साथ बेहतर काम करते हैं। कुछ काम बहुत कम पास के साथ बेहतर होते हैं। ध्यान दें कि नए लुआ संस्करणों पर और कुछ पैच (जो आपको उपयोग करने में डर नहीं होना चाहिए) पर जीसी को बेहतर बनाने में बहुत काम है!
  • अधिक उपरी भाग । हम प्रति टेबल-एंट्री मेमोरी ओवरहेड से बचने के लिए अपनी बड़ी डेटा संरचनाओं को सी-साइड में रखते हैं। C ++, C, और असेंबली आमतौर पर तेज कोड का उत्पादन करते हैं। तो यह खेल इंजन के 90% तक रखा जाता है जो महत्वपूर्ण प्रदर्शन नहीं करता है, और कभी-कभी हम लुआ से सी (या इसके विपरीत) की ओर पलायन करते हैं।
  • विखंडन । शायद छोटी मेमोरी सिस्टम पर सबसे बड़ा मुद्दा। हम आमतौर पर लुआ के लिए छोटे ऑब्जेक्ट पूल और एक पूरी तरह से अलग बड़े ऑब्जेक्ट हीप का उपयोग करते हैं। हम खेल में रणनीतिक बिंदुओं में पूर्ण जीसी पास डालते हैं। हम स्क्रिप्ट को अनलोड करते हैं या lua_Stateकुछ मामलों में पूरी तरह से फेंक देते हैं । और हमारे पास अभी भी कभी-कभी मुद्दे हैं। छोटे ऑब्जेक्ट पूल के आकार को ट्यूनिंग करना (वे निश्चितता, सादगी और निचले ओवरहेड के लिए) और लुआ-विशिष्ट बड़ी ऑब्जेक्ट हीप के आकार में दर्द हो सकता है। लेकिन लगभग 4 एमबी से बड़े सिस्टम पर, हमने अभी तक विशेष ढेर और पूल के साथ परेशान नहीं किया है।
  • प्रकार की सुरक्षा की कमी । आप एक अच्छे स्थिर कोड विश्लेषण टूलसेट बनाया नहीं है, तो आप क्रम त्रुटि जाँच (शायद का उपयोग करने का एक बहुत पर वापस गिर करने जा रहे हैं __indexऔर __newindex)। यदि आप संकलन समय पर त्रुटियों को पकड़ सकते हैं तो बेहतर है। इसको कम करने के लिए आप विभिन्न चीजें कर सकते हैं।

लुआ की अत्यधिक अनुशंसा की जाती है, बस इसके साथ थोड़ा काम करने के लिए तैयार रहें! तुम भी गिलहरी की जाँच करना चाहते हो सकता है , हालांकि मेरा मानना ​​है कि यह एक छोटा उपयोगकर्ता नाम है।


काश मैं इसे कई बार वोट कर पाता। बहुत व्यापक, बहुत ही व्यावहारिक, स्पष्ट रूप से संरचित। +1
कोअर्ल

5

वास्तव में 3 महान फायदे हैं:

ये कारक आपको गेम डेवलपर के रूप में सुविधाओं को सक्षम करने की अनुमति देते हैं जो विकास को गति देगा और आपके खेल की गुणवत्ता बढ़ाएगा।

उदाहरण के लिए:

  • आप बस फ़ाइल या नेटवर्क सॉकेट से अपने गेम को अपडेट करके अपने गेम लॉजिक को बदल पाएंगे।
  • आप उपयोगकर्ताओं को अपनी स्क्रिप्ट (बॉट या मॉड के लिए) बनाने की अनुमति दे सकते हैं
  • आपके गेम डिज़ाइनर और कलाकार आपके कंपाइल टूल सेट का उपयोग किए बिना गेम के कुछ हिस्सों को अपडेट और टेस्ट कर पाएंगे।
  • जब भी आप कुछ स्क्रिप्ट्स को बदलते हैं, तो आपको हर बार रिजेक्ट नहीं करना पड़ेगा।
  • यदि आप प्लेटफ़ॉर्म / इंजन / भाषाएँ बदलते हैं तो आपको पूरे गेम को फिर से लिखना नहीं पड़ेगा।

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

3

मेरे अनुभव से, थोड़ा उबला हुआ।

पेशेवरों

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

विपक्ष

  • लुआ स्मृति प्रबंधन खेल के लिए आदर्श नहीं है। आप इसके साथ सामना करते हैं, आपको यह पसंद नहीं है
  • लुआ डिबगिंग बॉक्स के बाहर भयानक है। आपको अनुभव को बेहतर बनाने के लिए काम करना होगा
  • Lua में डेटा रखने का मतलब है कि आपको Lua में डीबग करना होगा: C से इसका निरीक्षण करना शुरू में मुश्किल होगा
  • Lua में पैर सिंटैक्स में अपने आप को अच्छी तरह से शूट किया जाता है, जैसे सभी चर डिफ़ॉल्ट रूप से वैश्विक होते हैं
  • लुआ एक प्रोग्रामिंग भाषा है, किसी भी अन्य की तरह। गैर प्रोग्रामर से अपेक्षा न करें कि आप प्रोग्रामर को केवल इसलिए प्रोग्रामर में बदल सकते हैं क्योंकि आपने कंपाइलर को हटा दिया है
  • Lua को एकीकृत करने और समर्थन करने में अच्छा काम करना एक बड़ा हिस्सा है। उम्मीद मत करो कि यह सही बॉक्स से बाहर है। यह मान लेना उचित है कि आपको वास्तव में कुछ खेलों में इस लागत को बढ़ाना होगा

अंतिम, व्यक्तिगत, फैसला: यदि आप एक सभ्य आकार के खेल का निर्माण कर रहे हैं और पहले से ही एक स्क्रिप्टिंग भाषा नहीं है, तो लूआ प्राप्त करें। यह इसके लायक होगा।


1

गैरी का मॉड एक ऐसे खेल का एक उदाहरण है जो Lua और C ++ का उपयोग करता है। वे सभी मॉड्स के लिए लुआ का उपयोग करते हैं, जिससे लोगों के लिए उन्हें बनाना बहुत आसान हो जाता है। C ++ का उपयोग सभी इंटर्नल के लिए किया जाता है। मैं केवल यह सोच सकता हूं कि Lua C ++ जितना तेज नहीं होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.