एक MMO सर्वर के लिए खेल तर्क को परिभाषित करने के लिए Lua स्क्रिप्ट का उपयोग करना C ++ में संकलित की तुलना में बहुत धीमा होगा?


10

मैं अपने MMO सर्वर के लिए एक इकाई प्रणाली का उपयोग कर रहा हूं और मैं लूआ लिपियों का उपयोग करके "कार्यों" के व्यवहार को परिभाषित करने के बारे में सोच रहा था। सर्वर C ++ में लिखा गया है। मैं C ++ में Lua की गति / मेमोरी उपयोग से बहुत परिचित नहीं हूं लेकिन मैंने इसका उपयोग क्लाइंट के GUI को स्क्रिप्ट करने के लिए किया है। सर्वर साइड पर गेम लॉजिक को परिभाषित करने के लिए लुआ का उपयोग करने से प्रदर्शन में बहुत कमी आएगी?


संबंधित प्रश्न: gamedev.stackexchange.com/questions/2913/...
Tetrad

जवाबों:


20

टीएल; डीआर: लुआ में ओवरहेड होता है, लेकिन अगर इसका उपयोग ठीक से किया जाए तो यह नगण्य है और आसानी से कम हो जाता है। भारी गणित के संचालन या ज्यामिति को बदलने के लिए इसका उपयोग न करें। GUI की स्क्रिप्ट के लिए इसका उपयोग करने पर आपको संभवतः कोई प्रदर्शन समस्या नहीं दिखाई देगी।

मैंने खेल की स्क्रिप्टिंग भाषा के रूप में लुआ के प्रदर्शन के बारे में कुछ बुनियादी बेंचमार्क किए हैं, और यह बहुत तेज़ है। अपने खेल इंजन में LuaJIT को बांधने के लिए tolua ++ का उपयोग करते हुए, मैंने 2,000 अभिनेताओं को जन्म दिया, प्रत्येक Lua स्क्रिप्ट द्वारा नियंत्रित प्रत्येक अभिनेता को हर गेम लूप (एक समय-डेल्टा तर्क के साथ) कहा जाता है। आधे अभिनेताओं के पास एक झुंड की स्क्रिप्ट थी और बाकी आधे लोग एक तरह की रैंडम वॉक कर रहे थे (और झुंड से बच रहे थे)।

रेंडरिंग कंपोनेंट को बंद करने से मुझे अपने ओपर्टन 170 (2x2.0GHz) पर प्रति सेकंड 400 से अधिक टिक्स मिले, हालाँकि उस समय मेरा इंजन सिंगल था। मुझे लगता है कि अगर मैं अंदर खोदा और अनुकूलित किया, तो शायद मैं सी ++ में कुछ भारी काम कर रहा हूं, इससे काफी अधिक बाहर निचोड़ा जा सकता है। 2000 अभिनेताओं को प्रति सेकंड 400 बार अपडेट करना अभी भी बहुत प्रभावशाली था, और उस समय मेरी अपेक्षाओं से अधिक था।

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

थोड़ा दूर के विषय में, EVE ऑनलाइन के सर्वर लगभग पूरी तरह से स्टैकलेस पायथन में लिखे गए हैं (मेरा मानना ​​है कि वे अपने गणित के अधिकांश कार्यों को C ++ लिबास में स्थगित कर देते हैं), जो कि लूआ की तुलना में काफी भारी है, और, मेरे स्वयं के अनुसंधान और कई उपलब्ध पर आधारित है। बेंचमार्क, LuaJIT की तुलना में बहुत कम प्रदर्शन करने वाला। वे बहुत सारे मुद्दों के बिना 30k + समवर्ती खिलाड़ियों को संभालने का प्रबंधन करते हैं। दी, वे महंगे हार्डवेयर के एक टन है कि सब चल रहा है, लेकिन मुझे विश्वास है कि लागत का बहुमत उनके डेटाबेस क्लस्टर में है ...

पाठ की दीवार के लिए माफी।


1
बहुत बढ़िया जवाब! इस तरह के विस्तृत जवाब के लिए माफी की कोई जरूरत नहीं है। मुझे लगता है कि मैं लूआ में परिभाषित घटक "क्रियाएं" विकसित करने के लिए समय लूंगा और कुछ बेंचमार्किंग करूंगा। धन्यवाद!
बराकत 2

2
इस तरह के सिस्टम में सबसे बड़ी हिट आमतौर पर स्क्रिप्ट्स को पार्स करना है, इसलिए स्टार्टअप पर इसे लोड करना सुनिश्चित करें।
कोडरंग

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

मैं असहमत हूं। जबकि एक सामान्य गेम गेम लॉजिक में निष्पादन समय का एक मामूली हिस्सा होता है (प्रतिपादन एक जानवर है), एक MMO सर्वर में यह एक बहुत बड़ा हिस्सा है, इसलिए प्रभाव कहीं अधिक पर्याप्त होगा। मेरे पास LUAJit और C ++ के साथ अनुभव है और जबकि LUAJit LUA की तुलना में काफी तेज है, यह C ++ की तुलना में अभी भी बहुत धीमा है (आप कोड C ++ को ठीक से मानते हैं)। मैं LUAJit के साथ वर्कफ़्लो स्वीकार करता हूँ भयानक है, लेकिन यह एक हिट लेता है गति। कोई फर्क नहीं पड़ता कि आप इसे कैसे मोड़ते हैं, स्ट्रिंग लुकअप, गतिशील प्रकार और कचरा संग्रह के साथ तालिकाओं में चर कीमत पर आते हैं। LUAJit .NET की तुलना में धीमा है, nuff ने कहा
Kaj

2

संक्षिप्त उत्तर: हां, हां यह होगा।

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

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