2012-03-07 5 views
5

मैं जब भी मैं एक ध्वनि प्रभाव खेलने का उपयोग करें:ओपनएएल के साथ, AL_PITCH और AL_GAIN महंगा सेट कर रहा है?

alSourcei(sources[index], AL_BUFFER, 0); 
alSourcei(sources[index], AL_BUFFER, bufferID); 
alSourcef(sources[index], AL_PITCH, 1.0); 
alSourcef(sources[index], AL_GAIN, 1.0);

यह एक महत्वपूर्ण AL_PITCH और AL_GAIN हर बार एक ध्वनि प्रभाव खेला जाता है की स्थापना हटाने के लिए अनुकूलन हो सकता है? जाहिर है क्योंकि वे हर बार 1.0 होते हैं जब मैं ध्वनि शुरू करता हूं तो मैं इसे एक बार सेट कर सकता हूं। AL_PITCH और AL_GAIN डिफ़ॉल्ट रूप से क्या मानते हैं यदि वे सेट नहीं हैं?

उत्तर

8

केवल जवाब का एक "सामान्य रूप में" प्रकार जहाँ तक अनुकूलन सा चला जाता है के रूप में एक कार्यान्वयन आवश्यक जब तक कुछ खास तरह से काम करने के लिए के रूप में यह स्थिति OpenAL विनिर्देश द्वारा निर्धारित के भीतर काम करता नहीं है, क्योंकि संभव है । फिर भी यह संभावना है कि सभी कार्यान्वयन समान रूप से कम या ज्यादा काम करते हैं।

सामान्य तौर पर, alSourcei/alSourcef कम से कम GetContextSuspended की तरह एक समारोह है, जो धागे की स्थानीय भंडारण और प्रवेश करने/एक महत्वपूर्ण खंड, साथ ही एक switch बयान छोड़ने के लिए किसी पहुंच शामिल है बुला (यह भी एक के माध्यम से एक कूद का मतलब शामिल संभवतः आउट-ऑफ-कोर पेज में संभावित रूप से कैश किए गए पते के बराबर फ़ंक्शन पॉइंटर, और संभवतः एक टीएलबी कैश एंट्री बर्बाद कर रहा है)।

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

AL_GAIN और AL_PITCHप्रति से लगभग एक नि: शुल्क ऑपरेशन है। यह एक मान सेट करता है और स्रोत को अद्यतन के रूप में चिह्नित करता है, इसलिए संदर्भ मिक्सर थ्रेड जानता है कि अगली बार स्लाइस मिश्रण करते समय कुछ बदल गया है। सबसे बुरे मामले में, यदि पैरामीटर अवैध हैं, तो alSourcef को अंतिम त्रुटि कोड सेट करने की आवश्यकता है।

जहां तक, ज़ाहिर है alSourcef इच्छा के कॉल को हटाने के कुछ अनावश्यक कॉल से बचने के लिए, और के बाद से आप कहते हैं कि वहाँ कोई मौका नहीं मान कुछ और लेकिन 1.0 हो सकता है कि, वहाँ वास्तव में कभी स्पर्श करने के लिए कोई कारण नहीं है उन पर सब , क्योंकि यह विनिर्देश के अनुसार डिफ़ॉल्ट मान है।
लेकिन ... यदि आप इन कॉलों को हटाने से एक उल्लेखनीय गति की उम्मीद करते हैं, तो आप शायद निराश होंगे (जब तक प्रति सेकंड कई सौ हजार नहीं होते)।

+0

धन्यवाद। यह खेल ध्वनि प्रभाव के लिए है। जैसा कि आप देख सकते हैं कि जब भी कोई यादृच्छिक ध्वनि प्रभाव खेलना आवश्यक है तो मैं स्रोत बफर साफ़ करता हूं और फिर स्रोत बफर सेट करता हूं। क्या प्रत्येक विशिष्ट ध्वनि प्रभाव के लिए स्रोतों के अलग-अलग सेट सेट करना अधिक आम है ताकि मुझे बफर सामग्री को साफ़ और रीसेट करने की आवश्यकता न हो? – Ryan

+0

यह कई कारकों पर निर्भर करता है। अधिकांश लोग कई स्रोत चाहते हैं, लेकिन फिर स्रोतों की तुलना में अधिक बफर। आम तौर पर, आपको प्रत्येक ध्वनि के लिए एक स्रोत की आवश्यकता होती है जिसे _concurrently_ खेलने की आवश्यकता होती है। एक एकल स्रोत को दस लाख बफर द्वारा खिलाया जा सकता है, लेकिन एक समय में केवल एक ही खेल सकता है। एक स्रोत जो नहीं खेलता है (_should_ नहीं) किसी भी CPU संसाधन का उपभोग नहीं करता है, लेकिन फिर भी स्मृति का उपभोग करेगा। इस प्रकार, कुछ अतिरिक्त होने से चोट नहीं आती है, हर ध्वनि के लिए शायद एक होता है। एक स्रोत सक्षम करना एक परमाणु कतार ऑपरेशन है, और एक बफर क्यूइंग एक परमाणु कतार ऑपरेशन है, इसलिए वे समान रूप से महंगी हैं। – Damon

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