2009-10-17 8 views
7

मैं, Xbox360 के लिए एक खेल पर काम कर रहा हूँ XNA का उपयोग कर बना सकते हैं। पर एक्सबॉक्स कचरा कलेक्टर बल्कि बुरी तरह से, एक पीसी पर एक की तुलना में कैसा प्रदर्शन कर तो कम से कम करने के लिए उत्पन्न कचरा रखने एक सुचारू रूप से प्रदर्शन खेल के लिए महत्वपूर्ण है।का उपयोग कर करता है एक प्रतिनिधि कचरा

मैं मुझे के जीवन के लिए एक बार पढ़ने कि एक प्रतिनिधि बुला कचरा पैदा करता है, लेकिन अब कचरा बनाने प्रतिनिधियों के सभी संदर्भ नहीं मिल रहा है याद है। क्या मैंने इसे अभी बनाया है या प्रतिनिधि गन्दा हैं?

हैं प्रतिनिधियों गंदा, एक समाधान के सुझाव के लिए बोनस अंक हैं।

public delegate T GetValue<T>(T value, T[] args); 

public static T Transaction<T>(GetValue<T> calculate, ref T value, params T[] args) where T : class 
{ 
    T newValue = calculate(value, args); 
    return foo(newValue); 
} 

मेरे कोड इस समय ऐसे ही अस्पष्ट लग रहा है, एकमात्र समाधान मैं के बारे में सोच सकते हैं प्रतिनिधियों की अपने आप को मुक्त करने के लिए एक वर्ग है जो एक अंतरफलक IValueCalculator विरासत में पारित करने के लिए है, और फिर मैं उस पर विधि कॉल कर सकते हैं इंटरफ़ेस, हालांकि वास्तव में बहुत साफ नहीं है!

+0

प्रतिनिधि वास्तव में छोटा होना चाहिए और एक नहीं बनाना चाहिए जब आप उन्हें निष्पादित करते हैं तो कचरे के बहुत सारे। (यदि वे कचरा बनाते हैं तो यह प्रत्येक के लिए बाइट से भरा मुट्ठी होना चाहिए)। एक इंटरफेस संदर्भ के आसपास गुजरना और जब आप पूरा कर लें तो इसका उपयोग न करें कचरा भी बनायेगा। – CodingBarfield

उत्तर

10

एक प्रतिनिधि स्वयं एक वस्तु है, इसलिए यदि आप एक अज्ञात विधि के लिए एक प्रतिनिधि बनाते हैं, और इसे निष्पादित करने के लिए किसी अन्य विधि को देते हैं, और भविष्य के संदर्भ के लिए प्रतिनिधि को स्टोर न करें, तो हाँ, कचरा पैदा करेगा।

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

collection.ForEach(delegate(T item) 
{ 
    // do something with item 
}); 

इस मामले में, एक नया प्रतिनिधि वस्तु बनाई गई है, लेकिन ForEach करने के लिए कॉल से परे यह संदर्भित नहीं है, और इस तरह कचरा संग्रहण के लिए पात्र।

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

तो प्रतिनिधियों का उपयोग कर ठीक होना चाहिए, लेकिन प्रतिनिधि वस्तुओं के अत्यधिक निर्माण एक समस्या होगी।


संपादित: Xbox और XNA के लिए स्मृति प्रबंधन पर एक अच्छा लेख यहाँ है: Managed Code Performance on Xbox 360 for XNA: Part 2 - GC and Tools। इस उद्धरण पर ध्यान दें:

तो कोई जीसी विलंबता को कैसे नियंत्रित करता है? उपकरणों के लिए नेटसीएफ की तरह, एक्सबॉक्स जीसी गैर-पीढ़ी है। इसका मतलब है कि हर संग्रह प्रबंधित ढेर पर एक पूर्ण संग्रह है। इस प्रकार, हम पाते हैं कि जीसी विलंबता जीवित वस्तुओं की संख्या के लिए लगभग रैखिक है ... फिर उस पर ढेर compaction की लागत जोड़ें। हमारे मानक बताते हैं कि गहरे ऑब्जेक्ट पदानुक्रम बनाम उथले वाले लोगों के बीच का अंतर नगण्य है, इसलिए यह ज्यादातर वस्तुओं की संख्या है। छोटी वस्तुओं से निपटने के लिए छोटी वस्तुएं कुछ हद तक सस्ता होती हैं।

जैसा कि आप देख सकते हैं, बहुत सारी अनावश्यक वस्तुओं को बनाने से बचने का प्रयास करें, और आपको बेहतर किराया देना चाहिए।

+0

मैं देखता हूं, यह जानना अच्छा है, हालांकि बिना किसी निर्माण किए लोड प्रतिनिधियों का उपयोग करने का प्रयास करना (लोड समय को छोड़कर) दिलचस्प होगा। – Martin

+1

सी # में बस कुछ भी इस तरह कचरा बनाता है। मैं अल्पकालिक संदर्भों के उपयोग से बचने की सलाह नहीं दूंगा। –

+3

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

14

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

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

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

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

+0

मैं आपसे सहमत हूं, और मैं वास्तव में कचरे के बारे में चिंता नहीं करता - मुझे बस सूचित होना पसंद है! हालांकि, क्या आप निश्चित हैं कि यह एक्सबॉक्स पर मामला है, जहां संग्राहक गैर पीढ़ी नहीं है? – Martin

+0

यह अभी भी मार्क-एन-स्वीप है, भले ही यह पीढ़ी न हो। –

+2

एक्सबॉक्स एक्सएनए जीसी का प्रदर्शन लाइव/मृत वस्तुओं की संख्या के सापेक्ष है, इसलिए हाँ, वस्तुओं की कुल संख्या को नीचे रखने की कोशिश करें। और हां, यह पता लगाने के लिए कि क्या आपको वास्तव में कोई समस्या है, एक मेमोरी प्रोफाइलर का उपयोग करें। –

1

प्रतिनिधि निर्माण कचरा उत्पन्न करता है, जैसा कि अन्य पहले से ही नोट किया गया है।

आपके उदाहरण में, params तर्क का उपयोग करके शायद कचरा भी उत्पन्न होता है।

पैराम्स कीवर्ड का उपयोग किये बिना अधिभार प्रदान करने पर विचार करें।

कारण है यही कारण है कि बहस के विभिन्न संख्या के साथ भार के आम तौर पर params कीवर्ड का उपयोग एक साथ पुस्तकालय तरीकों में मौजूद है:

देखें String.Format Method (String, Object[])

Format Method (String, Object) 
Format Method (String, Object[]) 
... 
Format Method (String, Object, Object) 
Format Method (String, Object, Object, Object) 
संबंधित मुद्दे