2015-01-12 3 views
5

पर वर्कअराउंड मेरे पास एक SharpDX प्रोजेक्ट है जो बहुत करीब है। यह बातचीत के लिए एक किनेक्ट का उपयोग करता है। इस वजह से मेरी परियोजना किनेक्ट क्षेत्र और KinectUserViewer ऑब्जेक्ट दोनों के लिए WPF का उपयोग करती है। SharpDX ने अब तक सब कुछ के लिए बहुत अच्छा काम किया है, हालांकि, जब यह प्रोग्राम के एक निश्चित हिस्से में जाता है जो प्रत्यक्ष 3 डी का उपयोग करता है, तो यह झिलमिलाहट शुरू होता है। यह स्पष्ट रूप से इस तथ्य से जुड़ा हुआ है कि D3Dimage (MainWindow.xaml में SharpDXElement द्वारा उपयोग किया गया) "WPF में कुशल D3D प्रतिपादन के लिए मौलिक रूप से टूटा और अनुपयुक्त" हो सकता है "[1]। क्या मेरे डब्ल्यूपीएफ तत्वों को रखने का कोई तरीका है और प्रत्यक्ष 3 डी के साथ झटका नहीं है?SharpDXElement विकल्प की आवश्यकता है। SharpDX WPF flickering

+0

आप कुछ संबंधित कोड दिखाने सकते हैं? यह इस तरह के प्रश्न का उत्तर देने पर आप कहां हैं, यह देखने में काफी मदद मिलेगी। – rfornal

+0

इसमें कोड की 15000 से अधिक लाइनें हैं। प्रासंगिक कोड खोजना मुश्किल है। यह ड्रॉ और अपडेट लूप के लिए toolkit.game क्लास का उपयोग करता है। मैं मुख्य रूप से स्प्राइटबैच का उपयोग करता हूं लेकिन इसके कुछ भाग प्रश्न में भाग सहित xna और direct3D दोनों का उपयोग करते हैं। क्या विशेष रूप से कोई हिस्सा है जो आपको लगता है कि मदद करेगा? – Asor

+0

कहें, मैंने आपके लिंक पर एक नज़र डाली और जब मैंने आपके उद्धरण के संदर्भ को देखा, तो उन्होंने विंडोज फॉर्म का उपयोग करके सीमित वर्कअराउंड का भी उल्लेख किया। अगर मैं वर्कअराउंड समझ गया, तो यह अनिवार्य रूप से डी 3 डीमेज प्रतिस्थापन क्षेत्र में एक विंडोज फॉर्म होस्ट करेगा - और मुझे लगता है कि * केवल * वह क्षेत्र XAML तत्वों का उपयोग करने में सक्षम नहीं होगा। क्या वह काम तुम्हारे लिये होगा? या क्या मुझे कामकाज की प्रकृति के बारे में कुछ याद आ रहा है? –

उत्तर

5

फ़्लिकरिंग संभवतः इंगित करता है कि डी 3 डीमेज इसे अपने फ्रंट बफर पर कॉपी करने की कोशिश करने से पहले जीपीयू फ्रेम को प्रस्तुत नहीं कर रहा है। यह आसानी से डब्ल्यूपीएफ में हो सकता है क्योंकि डब्ल्यूपीएफ एक फ्रेम प्रस्तुत करने के लिए एक स्वैप श्रृंखला में प्रस्तुत करने के मानक तंत्र का उपयोग नहीं करता है। - मुझे लगता है कि फाइल में Device.Flush() नहीं दिख रहा है, लेकिन मुझे लगता है कि यह फोन करने के कोड में है

// rendering code 
Device.Flush(); // or equivalent, depending on Direct3D version used 
D3DImage.Lock(); 
D3DImage.AddDirtyRect(...); 
D3DImage.Unlock(); 

कम से कम पैटर्न SharpDXElement.InvalidateRender द्वारा पीछा किया है कि: इसके बजाय, सबसे कोड निम्नलिखित की तरह कुछ का उपयोग करता है।

समस्या यह है कि Device.Flush() तुल्यकालिक नहीं है। यह हल्के जीपीयू लोड के लिए ठीक काम करता है - लॉक/अनलॉक कोड समाप्त होने से पहले जीपीयू खत्म हो जाता है - लेकिन भारी भार के लिए यह अक्सर प्रतिपादन समाप्त नहीं होता है, जिसके परिणामस्वरूप कम से कम कुछ फ्रेम के लिए एक खाली फ्रेम होता है। यह झिलमिलाहट के रूप में प्रकट होता है।

ओपन सोर्स के बारे में अच्छी बात यह है कि आप कोड को संशोधित कर सकते हैं। , कि कम कर देता है या अपने झिलमिलाहट समाप्त तो

D3DImage.Lock(); 
Thread.Sleep(2); // 2ms 
D3DImage.AddDirtyRect(...); 
D3DImage.Unlock(); 

यह आपकी समस्या है: इस समस्या को सत्यापित करने और एक आसान (hackish) समाधान प्रदान करने के लिए, GPU के थोड़ा और समय देने का प्रयास करें। डायरेक्ट 3 डी 10 या 11 के लिए कम से कम एक और समाधान, use query events as described in this question है।

विंडोज फॉर्म का उपयोग करने में समस्या यह है कि आप डब्ल्यूपीएफ एयरस्पेस मुद्दों (बच्चे की खिड़की से ऊपर खींचने के लिए डब्ल्यूपीएफ वस्तुओं की क्षमता की कमी) के साथ समाप्त होते हैं। Airspace issues can be fixed, लेकिन काम SharpDXElement को संपादित करने से काफी जटिल है।

1

मुझे एक ही समस्या थी, DeviceCreationFlags.SingleThreaded ने मेरी मदद की।

2

समस्या लॉकिंग तंत्र नहीं है। आम तौर पर आप छवि प्रस्तुत करने के लिए आकर्षित करने के लिए Present का उपयोग करते हैं। Present सभी ड्राइंग तैयार होने तक प्रतीक्षा करेंगे। D3DImage के साथ आप Present() विधि का उपयोग नहीं कर रहे हैं। प्रस्तुत करने के बजाय, आप एक गंदगी को जोड़कर लॉक करते हैं और D3DImage अनलॉक करते हैं।

प्रतिपादन एसिंच्रोन किया जाता है ताकि जब आप अनलॉक कर रहे हों, ड्रॉ क्रियाएं तैयार नहीं हो सकती हैं। यह झिलमिलाहट प्रभाव पैदा कर रहा है। कभी-कभी आप आधा तैयार वस्तुओं को देखते हैं। एक खराब समाधान (मैंने परीक्षण किया है) अनलॉक करने से पहले एक छोटी देरी जोड़ रहा है। इससे थोड़ा सा मदद मिली, लेकिन यह एक साफ समाधान नहीं था। बिलकुल बकवास था!

समाधान:

मैं कुछ और के साथ जारी रखा; मैं एमएसएए (एंटीअलाइजिंग) के साथ समाप्त हो रहा था और पहली समस्या का सामना करना पड़ा; एमएसएए dx11/dx9 साझा बनावट पर नहीं किया जा सकता है, इसलिए मैंने एक नए बनावट (dx11) पर प्रस्तुत करने का निर्णय लिया और dx9 साझा बनावट में एक प्रतिलिपि बनाई। मैंने टेबल पर अपना सिर फिसल दिया, क्योंकि अब यह एंटी-एलाइज्ड था और फ्लिकिंग-फ्री !!

ऐसा लगता है कि थ्रैश कॉपी एक्शन इंतजार कर रहा है जब तक कि सभी ड्राइंग तैयार न हों (बेशक) अब यह ड्राइंग को पूरा करने में मदद करता है।

तो, बनावट की एक प्रति बनाकर:

DXDevice11.Device.ImmediateContext.ResolveSubresource(
    _dx11RenderTexture, 0, _dx11BackpageTexture, 0, ColorFormat); 

(_dx11BackpageTexture साझा बनावट और _dx11RenderTexture MSAA DX11 बनावट है) जब तक प्रतिपादन के लिए तैयार है और एक प्रतिलिपि बना देगा इंतजार करेंगे।

यह कैसे मैं अस्थिर से छुटकारा मिला है ....

+0

ब्रिलियंट। कोशिश करने के लिए जा रहे हैं। वर्षों से डीएक्स 11/डीएक्स 9 झिलमिलाहट से पीड़ित हो गए हैं और इतने सारे हैक्स/कामकाज की कोशिश की है ... –

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