2011-01-29 16 views
6

मैं एक्सएनए का उपयोग कर स्क्रीन पिक्सेल-बाय-पिक्सेल पर आकर्षित करने की कोशिश कर रहा हूं, लेकिन संसाधनों में समस्याएं हैं। मैंने सोचा कि सबसे अच्छा तरीका 1 बनावट होगा जो प्रत्येक फ्रेम को अपडेट करे, लेकिन मुझे इसे अद्यतन करने में समस्या हो रही है। यहाँ मैं सिर्फ एक परीक्षण के रूप में अब तक मिल गया है, बताया गया है:एक्सएनए में 2 डी पिक्सेल-बाय-पिक्सेल कैसे आकर्षित करें?

Texture2D canvas; 
Rectangle tracedSize; 
UInt32[] pixels; 

protected override void Initialize() 
    { 
     tracedSize = GraphicsDevice.PresentationParameters.Bounds; 
     canvas = new Texture2D(GraphicsDevice, tracedSize.Width, tracedSize.Height, false, SurfaceFormat.Color); 
     pixels = new UInt32[tracedSize.Width * tracedSize.Height];    

     base.Initialize(); 
    } 

protected override void Draw(GameTime gameTime) 
    { 
     GraphicsDevice.Clear(Color.CornflowerBlue); 

     pixels[100] = 0xFF00FF00; 
     canvas.SetData<UInt32>(pixels, 0, tracedSize.Width * tracedSize.Height); 

     spriteBatch.Begin(); 
     spriteBatch.Draw(canvas, new Rectangle(0, 0, tracedSize.Width, tracedSize.Height), Color.White); 
     spriteBatch.End(); 

     base.Draw(gameTime); 
    } 

जब ड्रा() दूसरी बार कहा जाता है, मैं निम्नलिखित त्रुटि मिलती है:।

"ऑपरेशन रद्द कर दिया गया है आप नहीं हो सकता किसी डिवाइस पर सेट किए गए संसाधन को संशोधित करें, या उसके बाद टाइलिंग ब्रैकेट के अंदर उपयोग किया गया है। "

यदि मैं ड्रा() में एक नया Texture2D बनाने का प्रयास करता हूं, तो मुझे जल्दी से स्मृति त्रुटि से बाहर निकलना पड़ता है। यह विंडोज फोन के लिए है। ऐसा लगता है कि मैं इसे गलत तरीके से करने की कोशिश कर रहा हूं, मुझे इसे बनाने के लिए अन्य विकल्प क्या हैं?

+0

मुझे जवाब नहीं पता था इसलिए मैंने "xna प्रक्रियात्मक बनावट" (जिसे इस तरह की चीज कहा जाता है) गुगल किया गया। ऐसा करने के लिए एक सरल, अंतर्निहित तरीका प्रतीत नहीं होता है। कम से कम तीन आम सुझाव हैं (बफरिंग, जीपीयू बनावट कमांड, इसे एक शेडर में कर रहे हैं)। आखिरी स्पष्ट रूप से इष्टतम है, लेकिन शेडर प्रोग्रामिंग ज्ञान की आवश्यकता है। आप एक ही खोज करना और ब्राउज़ करना चाहते हैं कि वहां क्या हो रहा है। – Tergiver

उत्तर

5

सेटडाटा को कॉल करने से पहले GraphicsDevice.Textures[0] = null सेट करने का प्रयास करें। प्रभाव के आधार पर आप एक और अधिक प्रभावी तरीका हो सकते हैं, आप Silverlight WriteableBitmap पर भी विचार कर सकते हैं।

संपादित करें: इस कोड मैं एमुलेटर में परीक्षण किया गया है:

Texture2D canvas; 
Rectangle tracedSize; 
UInt32[] pixels; 

protected override void Initialize() 
{ 
    tracedSize = GraphicsDevice.PresentationParameters.Bounds; 
    canvas = new Texture2D(GraphicsDevice, tracedSize.Width, tracedSize.Height, false, SurfaceFormat.Color); 
    pixels = new UInt32[tracedSize.Width * tracedSize.Height]; 

    base.Initialize(); 
} 
Random rnd = new Random(); 
protected override void Draw(GameTime gameTime) 
{ 
    GraphicsDevice.Clear(Color.CornflowerBlue); 

    GraphicsDevice.Textures[0] = null; 
    pixels[rnd.Next(pixels.Length)] = 0xFF00FF00; 
    canvas.SetData<UInt32>(pixels, 0, tracedSize.Width * tracedSize.Height); 

    spriteBatch.Begin(); 
    spriteBatch.Draw(canvas, new Rectangle(0, 0, tracedSize.Width, tracedSize.Height), Color.White); 
    spriteBatch.End(); 

    base.Draw(gameTime); 
} 
+0

ग्राफिक्सडिवाइस। पाठ [0] = शून्य काम नहीं करता है। – Curyous

+0

बहुत बहुत धन्यवाद, मुझे यह आपके उदाहरण से काम करने के लिए मिला है। मुझे लगता है कि पहली बार मैंने कोशिश की थी कि मैं ड्रा() में एक Texture2D को नया कर रहा हूं। – Curyous

3

आप मूल रूप से के रूप में यह अपवाद में पूछता है क्या करने की जरूरत:

यह सुनिश्चित करें कि बनावट ग्राफिक्स पर सेट नहीं है डिवाइस, Draw के अंत में इस डाल:

GraphicsDevice.Textures[0] = null; 

सुनिश्चित करने के लिए आप एक खपरैल ब्रैकेट अंदर ड्राइंग नहीं कर रहे हैं, अंदर SetData का उपयोग नहीं करते Draw पर बिल्कुल। SetData पर Update पर कॉल को ले जाएं।


बोनस की जानकारी: आपका आउट-ऑफ-स्मृति त्रुटि है, क्योंकि आप अप्रबंधित संसाधन है कि Texture2D आबंटित करता है (कचरा कलेक्टर उन्हें ट्रैक नहीं कर सकते जारी नहीं कर रहे हैं, तो यह आप बाहर चला रहे हैं पता नहीं है स्मृति की)। आपको बनावट पर Dispose पर कॉल करने की आवश्यकता है। हालांकि एक नया बनावट बनाना प्रत्येक फ्रेम एक बुरा विचार है वैसे भी (प्रदर्शन और मेमोरी विखंडन समस्याओं से बचने का कोई तरीका नहीं है)।

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