2008-09-15 24 views
11

मैंने लगभग 10 वर्षों तक गेम प्रोग्राम नहीं किया है (मेरा आखिरी अनुभव डीजेजीपीपी + एलेग्रो था), लेकिन मैंने सोचा कि मैं सप्ताहांत में एक्सएनए की जांच करूँगा यह देखने के लिए कि यह कैसे आकार दे रहा था।गेम प्रोग्रामिंग और इवेंट हैंडलर

मैं काफी प्रभावित हूं, हालांकि मैं एक गेम इंजन को एक साथ रखना जारी रखता हूं, मेरे पास एक (संभवतः) मूल प्रश्न है।

गेम को चलाने के लिए आप सी # के प्रतिनिधियों और घटनाओं पर कितना भरोसा कर सकते हैं? एक आवेदन प्रोग्रामर के रूप में, मैं प्रतिनिधियों और घटनाओं का भारी उपयोग करता हूं, लेकिन मुझे नहीं पता कि ऐसा करने के लिए कोई महत्वपूर्ण ओवरहेड है या नहीं।

मेरे गेम इंजन में, मैंने एक प्रकार का "पीछा कैमरा" डिज़ाइन किया है, जिसे किसी ऑब्जेक्ट से जोड़ा जा सकता है और फिर ऑब्जेक्ट के सापेक्ष अपनी स्थिति को फिर से समझता है। जब ऑब्जेक्ट चलता है, पीछा कैम को अपडेट करने के दो तरीके हैं।

  • मुख्य गेम लूप में "अपडेट कैमरा()" विधि है।
  • किसी ईवेंट हैंडलर का उपयोग करें, और पीछा करने वाला कैमरा ऑब्जेक्ट की सदस्यता लेता है।

मैं बाद का उपयोग कर रहा हूं, क्योंकि यह मुझे घटनाओं को एक साथ श्रृंखला करने और इंजन के बड़े हिस्सों को अच्छी तरह से स्वचालित करने की अनुमति देता है। अचानक, 3-5 लाइन इवेंट हैंडलर के मुट्ठी भर में भारी और जटिल हो जाएगा ... यह एक सुंदरता है।

हालांकि, अगर प्रत्येक नैनोसेकंड को फायर करने वाले ईवेंट हैंडलर एक बड़ी मंदी के रूप में निकलते हैं, तो मैं इसे हटा दूंगा और लूप दृष्टिकोण के साथ जाऊंगा।

विचार?

उत्तर

10

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

यदि आप चाहते हैं कि आपका कोड सामान्य या गतिशील हो, तो आपको यह जांचने की आवश्यकता है कि किसी ईवेंट को कॉल करने से पहले कुछ सब्सक्राइब किया गया है या नहीं। सी # और .NET की घटना/प्रतिनिधि तंत्र आपको बहुत कम लागत (सीपीयू के संदर्भ में) प्रदान करता है।

यदि आप हर घड़ी चक्र के बारे में वास्तव में चिंतित हैं, तो आप कभी भी सामान्य/गतिशील गेम तर्क नहीं लिखेंगे। यह रखरखाव/विन्यास योग्य कोड और पूरी गति के बीच एक व्यापार बंद है।

अच्छी तरह से लिखा गया है, मैं घटनाओं/प्रतिनिधियों का पक्ष लेगा जब तक कि मैं साबित नहीं कर सकता कि यह एक मुद्दा है।

एकमात्र तरीका आपको सचमुच पता चलेगा कि यह आपके लिए कोई मुद्दा है या नहीं, यह आपके कोड को प्रोफाइल करके है - जिसे आपको किसी भी गेम विकास के लिए करना चाहिए!

1

एक्सएनए इसके साथ लिखे कुछ ड्राइव करने के लिए इंटरफेस, घटनाओं और प्रतिनिधियों के उपयोग को प्रोत्साहित करता है। गेमकंपोनेंट से संबंधित कक्षाओं पर नज़र डालें जो इसे आपके लिए सेट करते हैं।

उत्तर है, "जितना आप सहज महसूस करते हैं"।

थोड़ा विस्तार करने के लिए, उदाहरण के लिए आप गेमकंपोनेंट क्लास से कैमरेकंट्रोलर क्लास में लेते हैं और उसे प्राप्त करते हैं और इसे गेम.कंपोनेंट संग्रह में जोड़ते हैं। फिर आप अपने कैमरा कक्षाएं बना सकते हैं और उन्हें अपने कैमरेकंट्रोलर में जोड़ सकते हैं।

ऐसा करने से कैमरेकंट्रोलर को नियमित रूप से कॉल किया जा सकता है और यदि आप यही कर रहे हैं तो उचित कैमरे या एकाधिक कैमरों को चुनने और सक्रिय करने में सक्षम होंगे। ReoCode

1

मेरे अतिरिक्त समय असली काम से दूर में भी मैं XNA सीखने किया गया है:

यहाँ इस का एक उदाहरण (अपने ट्यूटोरियल के सभी उत्कृष्ट रहे हैं) है।

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

ईमानदार होने के लिए, मुझे लगता है कि एक अद्यतन कैमरे विधि पर जाकर एक समयपूर्व अनुकूलन हो सकता है। घटना प्रणाली में शायद कैमरे के अलावा अन्य उपयोग हैं।

4

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

साथ ही, यह महसूस करें कि इस वजह से, घटनाएं तुल्यकालिक हैं। यदि आपका ईवेंट श्रोता धीमा है, तो आप कक्षा ईवेंट को धीमा कर देंगे।

1

एक के रूप में अलग रूप में, आप को पता है कि Shawn Hargreaves, Allegro के मूल निर्माता, :-)

+0

मैंने नोटिस किया था। यह एक छोटी सी छोटी दुनिया है। – FlySwat

2

XNA टीम पर मुख्य डेवलपर्स यहां मुख्य प्रश्न हो रहा है में से एक है रुचि हो सकती है: "क्या सी # प्रतिनिधियों और घटनाओं का उपयोग करने के साथ जुड़े ओवरहेड है? "

घटनाओं में नियमित फ़ंक्शन कॉल की तुलना में थोड़ा महत्वपूर्ण ओवरहेड होता है।

प्रतिनिधिमंडल का उपयोग अंतर्निहित और इस तरह छुपा कचरा बना सकता है। कचरा विशेष रूप से एक्सबॉक्स 360 पर एक प्रमुख कारण प्रदर्शन समस्या हो सकती है।

private delegate void SpacialItemVisitor(ISpacialItem item); 

    protected override void Update(GameTime gameTime) 
    { 
     m_quadTree.Visit(ref explosionCircle, ApplyExplosionEffects); 
    } 

    private void ApplyExplosionEffects(ISpacialItem item) 
    { 
    } 

जब तक आप कचरा पैदा करने से बचने के रूप में, प्रतिनिधियों सबसे प्रयोजनों के लिए काफी तेजी से कर रहे हैं:

निम्नलिखित कोड EntityVisitor वस्तुओं के रूप में प्रति सेकंड कचरे के बाइट्स 2000 के आसपास (60 fps) उत्पन्न करता है। छिपे खतरों की वजह से, मैं उनसे बचने और इसके बजाय इंटरफेस का उपयोग करना पसंद करता हूं।

1

प्रदर्शन के संदर्भ में किसी घटना के प्रभाव में जाने से पहले आपको पहले मूल्यांकन करना होगा कि इसकी आवश्यकता है या नहीं।

मान लीजिए कि आप वास्तव में एक पीछा कैम को अद्यतन रखने की कोशिश कर रहे हैं और यह सिर्फ एक उदाहरण नहीं है, जो आप खोज रहे हैं वह एक घटना नहीं है (हालांकि घटनाएं भी चाल चल सकती हैं), अगर आप अवतार की संभावना का पालन कर रहे हैं क्या यह ज्यादातर समय चल रहा है।

एक दृष्टिकोण जो मैंने बेहद प्रभावी पाया है, पदानुक्रमित परिवर्तनों का उपयोग करना है, यदि आप इस कुशलता से कार्यान्वित करते हैं तो कैमरा इस तरह के सिस्टम से लाभ प्राप्त करने वाला एकमात्र वस्तु नहीं होगा, लक्ष्य कैमरे को समन्वयित स्थान के भीतर रखना होगा ऑब्जेक्ट यह ट्रैकिंग कर रहा है।

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

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

+1

पड़ोस में एक नया necromancer आया है ... – Blau

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