2012-12-11 19 views
13

तो मैं एक्सएनए 3.1 के साथ एक चीज़ बना रहा हूं, और मेरे पास बहुत से अलग प्रभाव हैं जो पिक्सेल शेडर्स के माध्यम से लागू होते हैं। ये सभी प्रकार के स्रोतों से आते हैं, जैसे विशेष हमले, पर्यावरण, और बहुत आगे। मेरे पास जो मुद्दा है वह यह है कि मैं फ्रेम दर में महत्वपूर्ण कमी देख रहा हूं।कई पिक्सेल शेडर्स को कुशलता से जोड़कर

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

foreach(KeyValuePair<Ref<int>,Effect> p in renderEffects) 
{ 
    Effect r = p.Value; 
    g.SetRenderTarget(0, MainGame.MainRenderTarget); 
    //Change RenderTarget to allow code to grab existing texture in the same draw area. 
    levelDraw = MainGame.LevelRenderTarget.GetTexture(); 
    //Change back to draw back to this texture, allowing render effects to be layered. 
    g.SetRenderTarget(0, MainGame.LevelRenderTarget); 

    MainGame.StartDraw(MainGame.GameBatch); 
    //Starts the sprite batch and sets some parameters 
    r.Begin(); 
    r.CurrentTechnique.Passes[0].Begin(); 
    MainGame.GameBatch.Draw(levelDraw, new Rectangle(0, 0, levelDraw.Width, levelDraw.Height), Color.White); 
    r.CurrentTechnique.Passes[0].End(); 
    r.End(); 
    MainGame.GameBatch.End(); 
} 

अब, यह ध्यान देने योग्य का उत्पादन फ्रेम केवल 3 प्रभावों को लेते समय गिरता है, और 10 लागू करते समय, यह 60 एफपीएस से 16 एफपीएस तक गिर जाता है, जो निश्चित रूप से अस्वीकार्य है। मैं सोच रहा हूं कि ऐसा करने का एक और अधिक प्रभावी तरीका है या नहीं। ध्यान में रखते हुए कि मेरे पास केवल एक बनावट है, मैंने सोचा कि मैं प्रभाव को एक फ़ाइल में जोड़ सकता हूं और बनावट को वापस पकड़ने के बिना एकाधिक पास निष्पादित कर सकता हूं। मुझे यकीन नहीं है कि यह संभव है, हालांकि।

मुझे सच में यकीन नहीं है कि यह करने का सबसे अच्छा तरीका कैसा है, हालांकि मुझे लगता है कि जिस तरह से मैं इसे कर रहा हूं उससे बेहतर तरीका होना चाहिए।

+3

मैं अपने शीर्षक संपादित किया है को देखने के लिए चाहते हो सकता है। कृपया देखें, "[प्रश्नों में उनके शीर्षक में" टैग "शामिल होना चाहिए?] (Http://meta.stackexchange.com/questions/19190/)", जहां आम सहमति है "नहीं, उन्हें नहीं करना चाहिए"। –

+0

इसके लिए धन्यवाद। मैं उन्हें लोगों को यह जानने के लिए शामिल करता हूं कि वे टैग को देखने के बजाय, एक नज़र में मदद कर सकते हैं या नहीं, लेकिन मैं वहां उनका उपयोग न करने में तर्क देख सकता हूं। – Hoeloe

+2

टैग में एक गड़बड़ शीर्षक को देखने से बेहतर तंत्र शामिल है। आप "पसंदीदा टैग" सेट कर सकते हैं जो उन टैग के संदेशों को हाइलाइट करने का कारण बनेंगे; और "अनदेखा टैग" जो उन टैग के साथ संदेशों को छुपाएगा। –

उत्तर

1

क्या आप आकर्षित करते समय सब कुछ पूरी तरह से छायांकन कर रहे हैं? यदि आपके शेडर्स भारी गणना कर रहे हैं, तो आपको पहले "गहराई पास" करना चाहिए, केवल ज़ेड बफर (रंग बफर लिखना बंद है) लिखना/लिखना चाहिए। साथ ही, स्क्रीन को "गहराई से भरने" के लिए छोटे से सरल शेडर का उपयोग करें।

दूसरे शब्दों में, सभी अपारदर्शी वस्तुओं को केवल पहले पास पर गहराई बफर अद्यतन करने दें।

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

संपादित करें: अब मुझे एहसास है कि ओपी पूर्णस्क्रीन प्रभाव कर रहा है, न कि दृश्य प्रस्तुत करना।

+0

मैं केवल एक बनावट के लिए शेडर्स को लागू कर रहा हूं, इसलिए गहराई बफर के साथ कोई समस्या नहीं होनी चाहिए, क्योंकि प्रत्येक पिक्सेल केवल प्रत्येक पास के लिए एक बार खींचा जाता है, और गहराई बफर में कभी भी पिक्सेल ओवरड्राउन नहीं किया जाएगा। – Hoeloe

+0

मैं देखता हूं कि आपका क्या मतलब है, आप बस पूर्ण स्क्रीन प्रभावों की एक श्रृंखला को लागू करने के लिए एक विशाल क्वाड "बिलबोर्ड" करते हैं और यही वह प्रदर्शन है जो बाधा प्रदर्शन कर रहा है? – doug65536

+0

क्या राज्य परिवर्तनों को कम करने के लिए अपने प्रभाव पाश को सॉर्ट करना संभव है? आम तौर पर, विस्तार में कमी में: शेडर प्रोग्राम, बनावट बाध्यकारी, बफर बाध्यकारी, अन्य। शायद आप राज्य परिवर्तनों को कम करने के लिए पासों को पुन: व्यवस्थित करके राज्य परिवर्तनों से बच सकते हैं। कुछ राज्यों को कभी भी बदलने से रोकने के लिए वेरटेक्स बफर और बनावट बड़े बनावट/बड़े वर्टेक्स बफर पर टाइल किए जा सकते हैं। – doug65536

2

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

आप Shawn Hargreaves article on shader fragments in HLSL और Tim Jones's code for doing this in XNA

+0

टिम जोन्स का कोड मेरे लिए बेकार है, क्योंकि यह एक्सएनए 4 में है, जबकि मैं 3.1 का उपयोग कर रहा हूं। हालांकि, इन लेखों को जोड़ने के लिए धन्यवाद। – Hoeloe

+0

आपकी समस्या के आकार के लिए आप संयोजक चीज़ को मैन्युअल रूप से करने के लिए बेहतर हो सकते हैं - आपको शायद लगता है कि प्रभावों को ढंकने से चीजों को दृढ़ता से समझने में कठिनाई होती है, जिसका अर्थ है कि जटिल बहु-प्रभाव वाले संस्करणों को बिना सस्ता बनाने के लिए अनुकूलित किया जा सकता है देखो से अलग हो रहा है। – theodox

+0

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

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