2008-09-15 19 views
25

मैं अपने ऐप के विभिन्न हिस्सों को सरल स्क्रिप्ट में स्थानांतरित करना चाहता हूं, ताकि उन लोगों को अनुमति दी जा सके जो सी ++ का मजबूत ज्ञान नहीं रखते हैं ताकि विभिन्न सुविधाओं को संपादित और कार्यान्वित किया जा सके।सी ++ ऐप में स्क्रिप्ट को कार्यान्वित करना

क्योंकि यह एक वास्तविक समय ऐप है, इसलिए मुझे इन स्क्रिप्ट के लिए कुछ प्रकार के मल्टीटास्किंग की आवश्यकता है। आदर्श रूप में मैं इसे चाहता हूं ताकि सी ++ ऐप एक स्क्रिप्ट फ़ंक्शन को कॉल करता है जो तब भी जारी रहता है (सी ++ थ्रेड के नीचे) जब तक कि कोई पॉज़ पॉइंट (प्रतीक्षा करें (x)), या यह वापस आ जाता है। इसके इंतजार के मामले में राज्य को स्क्रिप्ट के लिए अगली बार फिर से शुरू करने की जरूरत है जब अगली बार अवधि समाप्त हो जाने के बाद ऐप लूप हो जाए।

स्क्रिप्ट को सी ++ वर्ग विधियों को कॉल करने में सक्षम होने की आवश्यकता है, आदर्श रूप से सी ++ कक्षाओं के आसपास सादे रैपर कार्यों के बजाय सी ++ कक्षाओं का उपयोग करना।

मैं इसे लागू करने में भारी मात्रा में खर्च नहीं करना चाहता, इसलिए मौजूदा स्क्रिप्टिंग भाषा का उपयोग करके मुझे अपना लिखना पसंद है। मैंने सुना है कि पायथन और लुआ को सी ++ ऐप में एकीकृत किया जा सकता है, लेकिन मुझे नहीं पता कि मेरे लक्ष्यों को प्राप्त करने के लिए इसे कैसे किया जाए।

  • लिपियों
  • लिपियों के लिए "ठहराव" जब कुछ कार्यों कहा जाता है (उदाहरण के लिए। रुको) सक्षम होना चाहिए C++ कार्यों कॉल करने के लिए सक्षम होना चाहिए, और C++ धागा
  • आवश्यकताओं द्वारा फिर से पुन: आरंभ किया तेजी से होने के लिए - यह एक वास्तविक समय ऐप के लिए है और संभावित रूप से बहुत सी स्क्रिप्ट चल रही हैं।

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

उत्तर

25

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

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

हमने कई प्लेटफ़ॉर्म (Win32, Xbox360 और PS3) पर ऐप्स में लूआ का निर्माण किया है। मेरा मानना ​​है कि यह x64 पर काम करेगा। लुबाइंड का उपयोग करने का सुझाव अच्छा है। हम दोनों के बीच अपना इंटरफ़ेस लिखना घायल हो गए और बहुत जटिल नहीं होने पर, उस गोंद कोड से आपको बहुत समय और शायद बढ़ोतरी होगी।

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

लुआ कोड स्वयं काम करने की ज़रूरत है यदि आपको वहां बदलाव करने की आवश्यकता है। हमने लुआ कोडेबेस में बग्स को देखा है जो ट्रैक करना मुश्किल था। मुझे संदेह है कि बूस्ट :: पायथन में ऐसी ही समस्याएं हो सकती हैं।

और किसी भी स्क्रिप्टिंग भाषा के साथ, यह "गैर-प्रोग्रामर" कार्यक्षमता बढ़ाने के लिए आवश्यक नहीं है। ऐसा लगता है, लेकिन आप शायद उचित समय व्यतीत करने के लिए स्क्रिप्ट डिबगिंग स्क्रिप्ट या यहां तक ​​कि लुआ भी खर्च कर सकते हैं।

सभी ने कहा, हम लुआ से बहुत खुश हैं और इसे दो गेम में भेज दिया है। वर्तमान में हमारे पास भाषा से दूर जाने की कोई योजना नहीं है। सब कुछ, हमने इसे कुछ अन्य विकल्पों से बेहतर पाया है जो कुछ साल पहले उपलब्ध थे। पायथन (और आयरनपीथन) अन्य विकल्प हैं, लेकिन अनुभव के आधार पर, वे लुआ से अधिक भारी हाथ लगते हैं। हालांकि मुझे अन्य अनुभवों के बारे में सुनना अच्छा लगेगा।

+0

लूआ ने आपके गेम के साथ वास्तव में काम कैसे किया है? उदाहरण के लिए प्रत्येक स्क्रिप्ट पूरी तरह से अपने स्वयं के धागे में पूरी तरह से चलती है, क्या प्रत्येक स्क्रिप्ट एक फ़ंक्शन की तरह संभाली जाती है (यानी कॉलिंग थ्रेड में इसे तब तक चलाना), या अपने स्वयं के मिनी-प्रोग्राम (जैसे मैंने ऊपर वर्णित) की तरह? –

+0

लुआ स्क्रिप्ट "थ्रेड" में चल सकती हैं और आवश्यक रूप से कार्यों की तरह इनलाइन को संभालने की आवश्यकता नहीं है। यह वही करेगा जो आप चाहते हैं। – Mark

+0

ठीक है। मैं इसके बारे में एक और अधिक विस्तृत रूप ले जाऊंगा और कुछ परीक्षणों को लिखने के लिए लिखूंगा कि मैं इसे अपने कोड बेस के साथ कैसे एकीकृत करना चाहता हूं :) –

2

Boost.Python लाइब्रेरी पर एक नज़र डालें। ऐसा लगता है कि आप जो चाहते हैं उसे करने के लिए यह काफी सरल होना चाहिए।

9

मैं अत्यधिक अनुशंसा कर सकता हूं कि आप Luabind पर एक नज़र डालें। यह आपके सी ++ कोड में इसके विपरीत लुआ को एकीकृत करना बहुत आसान बनाता है और इसके विपरीत। लुआ में इस्तेमाल होने वाली पूरी सी ++ कक्षाओं का पर्दाफाश करना भी संभव है।

3

आप निश्चित रूप से जो भी पाइथन के साथ चाहते हैं वह कर सकते हैं। Here are the docs on embedding Python into an application. मुझे यकीन है कि लुआ भी काम करेगा, मैं इससे कम परिचित हूं।

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

5

आपकी सर्वश्रेष्ठ शर्त या तो लुआ (www.lua.org) या पायथन (www.python.org) को एम्बेड करना है। दोनों गेम उद्योग में उपयोग किए जाते हैं और दोनों बाहरी "सी" कार्यों को अपेक्षाकृत आसानी से लुआ के साथ यहां बढ़ते हैं (क्योंकि डेटा प्रकारों को लुआ और सी के बीच अनुवाद करना आसान होता है)। सी ++ ऑब्जेक्ट्स में इंटरफेसिंग आपके अंत में थोड़ा और काम होगा, लेकिन आप Google पर या लुआ या पायथन चर्चा मंचों पर यह कैसे कर सकते हैं।

मुझे उम्मीद है कि इससे मदद मिलती है!

+0

ठीक है, वे दोनों अच्छे लगते हैं, लेकिन क्या वे रुकने/पुनरारंभ करने का समर्थन करते हैं और जिस तरह से मैं उन्हें धागे के साथ काम करना चाहता हूं (उदाहरण के लिए उस धागे का उपयोग करना जिसे स्क्रिप्ट कहा जाता है जब तक कि यह या तो रिटर्न या विराम न हो) –

+0

मैंने उपयोग नहीं किया है इनमें से कोई भी थ्रेडेड वातावरण में। आप इस सवाल को लुआ और पायथन विशिष्ट मंचों पर पोस्ट करना चाहेंगे। – Kevin

+2

@FireLancer: यह आपके लिए किसी भी उपयोग के लिए '08 में वापस आने के लिए दो साल की देरी है, लेकिन आज के किसी भी व्यक्ति के लिए आपके प्रश्न का उत्तर देने के बाद: लुआ आपके द्वारा वर्णित करने के लिए कोरआउट का उपयोग करता है। आप कोरआउट को रोकने के लिए "उपज()" को कॉल कर सकते हैं, और फिर से शुरू करने के लिए "फिर से शुरू करें()" को छोड़ सकते हैं।आप उपरोक्त() को प्राप्त करने के लिए पैरामीटर पास कर सकते हैं जो पिछले रेज़्यूमे() से वापस आते हैं, और फिर से शुरू करने के लिए पैरामीटर पास करते हैं() जो प्रासंगिक उपज() को फिर से शुरू कर देते हैं। – SomeCallMeTim

1

आप Ch का उपयोग कर सी/सी ++ स्क्रिप्ट को भी एम्बेड कर सकते हैं। मैं इसे एक ऐसे गेम प्रोजेक्ट के लिए उपयोग कर रहा हूं जिस पर मैं काम कर रहा हूं, और यह अच्छा है। बिजली और अनुकूलता का अच्छा मिश्रण।

2

SWIG पर एक नज़र डालें। मैंने इसे पायथन के साथ इंटरफेस करने के लिए उपयोग किया है, लेकिन यह कई अन्य भाषाओं का समर्थन करता है।

2

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

2

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

संबंधित मुद्दे