2013-08-13 21 views
7

ओपनजीएल फ़ंक्शंस को परिभाषित किया गया है कि वे सिंक्रनाइज़ेशन करते हैं। लेकिन प्रतिपादन कार्यों (और अन्य) को अक्सर GPU द्वारा असीमित रूप से निष्पादित किया जाएगा। ओपनजीएल प्रभावी रूप से इसे छुपाएगा: यदि आप ऐसा कुछ करते हैं जिसके लिए एक ऑपरेशन के परिणाम की आवश्यकता होती है (जैसे कि फ्रेमबफर से पढ़ा गया है), ओपनजीएल CPU ऑपरेशन को तब तक रोक देगा जब तक GPU उस बिंदु तक नहीं पहुंच जाता है।क्या यह बताने का कोई तरीका है कि ओपनजीएल ऑपरेशन समाप्त हो गया है या नहीं?

यह कार्यात्मक है, लेकिन प्रदर्शन के लिए शायद ही आदर्श है, क्योंकि सीपीयू मूल रूप से GPU होने तक अवरुद्ध हो जाता है। क्या यह निर्धारित करने का एक तरीका है कि कोई विशेष ऑपरेशन पूरा हो गया है, ताकि आप जान सकें कि एक निर्भर ऑपरेशन को इतनी सीपीयू अवरोधन के बिना निष्पादित किया जाएगा?

उत्तर

6

हां, वहां है। मान लें कि आपके पास OpenGL 3.2+ या ARB_sync एक्सटेंशन तक पहुंच है।

यदि आप जानना चाहते हैं कि कोई विशेष आदेश कब समाप्त हो गया है, तो आप उस आदेश को जारी करने के तुरंत बाद कमांड स्ट्रीम में "बाड़" sync object डाल सकते हैं। यह glFenceSync function के साथ किया जाता है।

आपको इस फ़ंक्शन द्वारा लौटाए गए पॉइंटर को स्टोर करना होगा। हाथ में उस सूचक के साथ, आप यह पूछ सकते हैं कि बाड़ glGetSync function के साथ संकेतित है या नहीं, यह जांच कर पूरा हो गया है। इस तरह:

GLint isSignaled = 0; 
glGetSync(syncObj, GL_SYNC_STATUS, 1, NULL, &isSignaled); 

if(isSignaled == GL_SIGNALED) 
{ 
    //Prior commands have completed. 
} 
else 
{ 
    //Not done yet. 
} 

यदि आप अन्य सामानों से बाहर निकलते हैं, तो आपको सिंक ऑब्जेक्ट को समाप्त करने की प्रतीक्षा करने की आवश्यकता नहीं है; आप जो भी ओपनजीएल प्रक्रिया करना चाहते हैं वह कर सकते हैं। इससे आपके लिए सीपीयू ब्लॉक प्रेरित होगा।

एक बार जब आप सिंक ऑब्जेक्ट के साथ समाप्त हो जाते हैं, तो आप को इसे हटाना होगा। ऐसा करने के लिए glDeleteSync function का उपयोग करें।

+0

महान प्रश्न। लेकिन क्या यह ठीक है और एक ही समय में जवाब देना ठीक है? ;) इसके अलावा, क्या इस तरह की एक सिंक जांच पाइपलाइन पर अधिक अनावश्यक ओवरहेड जोड़ नहीं सकती है? –

+1

@ माइकेलिव: "* लेकिन क्या यह एक ही समय में पूछना और जवाब देना ठीक है? *" हां। यही कारण है कि, जब आप एक प्रश्न पूछते हैं, तो नीचे एक बॉक्स है जो आपको इसे पूछने से पहले जवाब देने की अनुमति देता है। "अनावश्यक ओवरहेड" जोड़ने के लिए, बाड़ काफी हल्के वजन होने की उम्मीद है। आंतरिक चालक प्रक्रिया हर समय बाड़ का उपयोग करती है, ताकि * जब आप एक बफर ऑब्जेक्ट के साथ किया जाए तो आगे * बताएं। –

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

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