2013-01-23 22 views
5

मैं एक्सएनए में 2 डी गेम बना रहा हूं। ड्रॉइंग गेम घटकों का उपयोग करते समय जो प्रदर्शन के लिए बेहतर है?ऑफ-स्क्रीन होने पर XNA घटक ड्राइंग को कैसे रोकें?

1. जब कोई घटक ऑनस्क्रीन नहीं होता है तो उसे घटकों की सूची से हटा दिया जाता है और जब इसकी ऑनस्क्रीन इसे जोड़ती है।

2. जब अपने गुप्त न अपने ड्रॉ समारोह चलाने (एक "जाग" bool फ़ील्ड का उपयोग करके और एक अगर ड्रॉ समारोह में सब कुछ के आसपास बयान)

मैं विधि 2 का उपयोग कर रहा पल में है और यह ठीक काम करता है। इसके आसान cus घटकों के draworder बदल नहीं होगा (अगर मैं उन्हें हटा देता हूं और फिर से जोड़ता हूं, तो मुझे इसे प्रबंधित करने के लिए और अधिक कोड की आवश्यकता होगी) वास्तव में यह मेरे लिए हुआ कि अगर यह घटकों की सूची में नहीं है तो यह नहीं होगा अपडेट करें और मुझे इसकी ऑनस्क्रीन या नहीं .. ट्रैक करने के लिए कुछ और चाहिए ..

इसके अलावा मेरे पास प्रोफाइलर के साथ विजुअल स्टूडियो का फैंसी संस्करण नहीं है, इसलिए मैं सिर्फ यह पूछ रहा हूं कि लोग अपने अनुभव से क्या सोचते हैं

+1

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

+2

मैं चाहता हूं कि विकल्प 2 तेज होगा। – Cyral

+2

आप कितने 'DrawableGameComponent' का उपयोग करते हैं? यदि आप इसके कई उदाहरणों का उपयोग कर रहे हैं, तो आप शायद इसका गलत इस्तेमाल कर रहे हैं। –

उत्तर

5

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

असल में, स्प्रेइट्स को चलाने वाला जीपीयू धीमा नहीं है & सीपीयू को सभी स्प्राइट्स को बैच में व्यवस्थित करना धीमा नहीं है। धीमा हिस्सा तब होता है जब सीपीयू को जीपीयू को संवाद करना होता है जिसे इसे आकर्षित करने की आवश्यकता होती है (इसे बैच जानकारी भेजना)। जब आप spriteBatch.Draw() को कॉल करते हैं तो यह CPU CPU GPU संचार नहीं होता है। ऐसा तब होता है जब आप spriteBatch.End() को कॉल करते हैं। तो दक्षता के लिए कम लटकते फल spriteBatch.End() कम बार कॉल कर रहा है। (बेशक इसका मतलब है कि शुरूआत() कम अक्सर भी)। इसके अलावा, spriteSortMode.Imediate का उपयोग बहुत कम है क्योंकि यह तुरंत सीपीयू को प्रत्येक स्प्राइट जानकारी को GPU (धीमी) में भेजने का कारण बनता है)।

तो यदि आप प्रत्येक गेम घटक वर्ग में आरंभ() & एंड() को कॉल करते हैं, और आपके पास कई घटक हैं, तो आप अपने आप को बहुत समय तक अनावश्यक रूप से खर्च कर रहे हैं और आप शायद बेहतर बैचिंग योजना के साथ अधिक समय बचाएंगे ऑफस्क्रीन sprites के बारे में चिंताजनक।

इसके अलावा: GPU स्वचालित रूप से अपने पिक्सेल शेडर से ऑफस्क्रीन स्प्राइट को अनदेखा करता है। तो सीपीयू पर ऑफस्क्रीन स्प्राइट को खींचने से GPU समय बचा नहीं जाएगा ...

+0

बहुत बहुत धन्यवाद! बहुत जानकारीपूर्ण .. इसके अलावा, सिर्फ fyi, मेरे खेल में कमरे से बने प्रक्रियात्मक रूप से उत्पन्न स्तर है। मैंने प्रदर्शन के लिए कोड किए गए कुछ भी पहले 140 कमरे के साथ तनाव परीक्षण किया था और यह नरक धीमा था।मैं तो बना यह इतना ही कमरे आप वर्तमान में (मेरी पोस्ट में विधि 2) तैयार की है और प्रदर्शन आपका जवाब है कि सभी cpu था, जो एक craptop पर चल रहे इस के रूप में समझ में आता है की रोशनी में वापस सही करने के लिए चला गया, जो कर रहे हैं दृश्य स्टूडियो के साथ संघर्ष! :) मुझे लगता है कि मैं आपकी सलाह और फिर से वास्तुकार एक सा बनाने के लिए का पालन करेंगे मेरी शुरू और समाप्त बयान एक बहुत अधिक –

+0

मैं कहना है कि सिर्फ इसलिए कि आप drawablegamecomponents उपयोग कर रहे हैं, कि आप नहीं कर सकते हैं इसका मतलब यह नहीं चाहते हैं पकड़ उसी spritebatch.begin() का उपयोग करें। आप spritebatch के अंदर अपने base.draw बैठाना हैं, तो आप अपने मुख्य खेल फ़ाइल से शुरू करते हैं, तो अपने घटकों में अपने सभी ड्राइंग करते हैं, तो फिर से खेल फाइल में spritebatch.end कॉल कर सकते हैं। – TopHatHacker

+0

@TopHatHacker मुझे लगता है कि उल्लेख के बारे में सोचा, लेकिन जब मुझे एहसास हुआ कि अगर कोई 3 डी drawable घटकों और कुछ 2 डी घटक हैं, तो वह काम नहीं होता नहीं किया। –

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