XNA में प्रभाव मापदंडों की स्थापना के लिए सर्वोत्तम अभ्यास


13

मैं पूछना चाहता हूं कि क्या EffectXNA में पैरामीटर सेट करने के लिए सबसे अच्छा अभ्यास है । या दूसरे शब्दों में, जब मैं कहता हूं तो वास्तव में क्या होता है pass.Apply()। मैं कई परिदृश्यों की कल्पना कर सकता हूं:

  1. प्रत्येक बार Applyकहा जाता है, सभी प्रभाव मापदंडों को GPU में स्थानांतरित कर दिया जाता है और इसके बाद इसका कोई वास्तविक प्रभाव नहीं होता है कि मैं कितनी बार एक पैरामीटर सेट करता हूं।
  2. हर बार Applyकॉल किया जाता है, केवल उन मापदंडों को स्थानांतरित किया जाता है जिन्हें रीसेट किया गया था। इसलिए सेट-ऑपरेशन को कैशिंग करना जो वास्तव में एक नया मूल्य निर्धारित नहीं करता है, से बचा जाना चाहिए।
  3. हर बार Applyकॉल किया जाता है, केवल जो पैरामीटर बदले गए हैं वे स्थानांतरित किए जाते हैं। इसलिए सेट-ऑपरेशन को कैशिंग करना बेकार है।
  4. यह पूरा सवाल बूटलेस है क्योंकि उल्लेख के किसी भी तरीके का खेल के प्रदर्शन पर कोई उल्लेखनीय प्रभाव नहीं है।

तो अंतिम सवाल: क्या सेट ऑपरेशन के कुछ कैशिंग को लागू करना उपयोगी है जैसे:

private Matrix _world;
public Matrix World
{
    get{ return _world; }
    set 
    {
        if (value == world) return;
        _effect.Parameters["xWorld"].SetValue(value);
        _world = value;
    }
}

आपका धन्यवाद।


मैंने DirectX टैग जोड़ा, इस आधार पर कि यह XNA की तुलना में निम्न-स्तरीय कार्यक्षमता है।
एंड्रयू रसेल

मुझे इस बात का प्रमाण मिल गया है कि विषय बहुत ही व्यवहार्य है। ऐसा लगता है कि यदि आप चतुर हैं कि आपने अपने प्रभाव मापदंडों को कैसे सेट किया है, तो आप ड्रॉ कॉल की संख्या बढ़ा सकते हैं (यानी सीपीयू पर वे कितनी तेजी से संसाधित होते हैं) दो बार से अधिक। मैं अभी भी इसे जांचने
क्यूब्रमैन

जवाबों:


8

यह सब सीपीयू की तरफ होता है, इसलिए यदि कैशिंग एक उपयोगी विशेषता थी, तो मैं यह अनुमान लगाऊंगा कि ग्राफिक्स ड्राइवर इसे स्वयं लागू करेगा। अपनी खुद की कैशिंग परत जोड़ना अनावश्यक है।

मेरी समझ यह है कि जब भी आप कोई पैरामीटर सेट करते हैं, और जब भी आप कॉल करते हैं Apply, तो ये कॉल डायरेक्टएक्स पर काफी हद तक जैसे-जैसे होते हैं, और बदले में यूजर-मोड जीपीयू ड्राइवर के रूप में पास हो जाता है। उपयोगकर्ता-मोड ड्राइवर तब जो चाहे कर सकता है । आपके सभी तीन परिदृश्य संभव हैं।

(क्योंकि परिदृश्य # 2 एक संभावना है, यह शायद सबसे अच्छा नहीं है कि जानबूझकर फिर से सेटिंग मापदंडों के आसपास न चला जाए जो बदलते नहीं हैं।)

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

निश्चित रूप से अपने प्रदर्शन को मापने और क्या हो रहा है यह समझने के बिना इस तरह के अनुकूलन को लागू करना शुरू न करें।

इसके अलावा, एक की तुलना Matrixके साथ ==बुरा वूडू है। A , s Matrixसे बना है floatऔर फ्लोटिंग-पॉइंट समानता की तुलना कई मामलों में विफलता की संभावना है।

और, आम तौर पर बोल, पैटर्न if(x != y) x = y;बस की तुलना में धीमी है x = y


दिलचस्प बात यह है कि ड्राइवर को इस बारे में परवाह करनी चाहिए। लिंक के लिए धन्यवाद (और पुनः लिंक)।
0xBADF00D

मैं हाल ही में msdn से ज्यामिति उदाहरण उदाहरण भर में आया था । एक ही रेंडरस्ट्रेट्स (एक ही मान के साथ) को रीसेट करने पर प्रति फ्रेम कई बार दो या तीन बार रेंडरिंग प्रक्रिया को धीमा कर देता है। तो राज्य बैचिंग deferentially उपयोगी है। दुर्भाग्य से मुझे यकीन नहीं है कि यह स्थिति प्रभाव मापदंडों को स्थापित करने के लिए भी लागू होती है। लेकिन मैं अपनी जानकारी साझा करना चाहूंगा।
0xBADF00D

4

एक दिलचस्प बात मुझे इस विषय के बारे में मिली।

Msdn से:

आप किसी भी प्रभाव पैरामीटर को एक्सेस करने के लिए Parameters Indexed property को प्रभाव पर उपयोग कर सकते हैं, लेकिन यह EffectParameters का उपयोग करने की तुलना में धीमा है। इस कारण से, आपको प्रत्येक प्रभाव पैरामीटर के लिए एक EffectParameter बनाना चाहिए जो अक्सर बदलता रहता है।

तथा

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

इसका मतलब है कि _effect.Parameters["xWorld"].SetValue(value);की तुलना में काफी धीमी हैwordlParam.SetValue(value);

तो आप शायद इस तरह से कैश मापदंडों:

public EffectParameter wordlParam;
wordlParam = _effect.Parameters["xWorld"];

लेकिन मुझे कोई वास्तविक बेंचमार्क नहीं मिला।

सूत्रों का कहना है:

http://msdn.microsoft.com/en-us/library/Microsoft.Xna.Framework.Graphics.EffectParameter%28v=xnagamestudio.40%29.aspx http://msdn.microsoft.com/en-us/library /bb976060%28v=xnagamestudio.31%29.aspx


बस मोनोगेम और WP एमुलेटर पर यह परीक्षण किया गया है - मैं पुष्टि कर सकता हूं कि वास्तव में, एक महत्वपूर्ण अंतर है (मेरे मामले में 5-15% के बीच)। क्या कोई और ऐसी चालें हैं जो प्रदर्शन में मदद करती हैं?
कोनराड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.