पूर्ण XNA GS के बिना मशीन में फ़ाइल निर्यात करने के लिए XNA ContentPipeline का उपयोग करना


9

मेरा गेम रनटाइम पर स्प्राइटशीट लोड करने के लिए कंटेंट पाइपलाइन का उपयोग करता है। खेल के लिए कलाकार मुझे संशोधित स्प्रिटशीट भेजता है और मैं अपनी मशीन में एक निर्माण करता हूं और उसे एक अद्यतन परियोजना भेजता हूं। तो मैं उसकी मशीन में xnb फ़ाइलों को उत्पन्न करने का एक तरीका खोज रहा हूं (यह सामग्री पाइपलाइन का आउटपुट है) उसके बिना पूर्ण XNA गेम स्टूडियो स्थापित करने के लिए।

1) मैं नहीं चाहता कि मेरे कलाकार वीएस + एक्सना स्थापित करें (मुझे पता है कि वीएस का एक नि: शुल्क संस्करण है, लेकिन जब हम टीम में अधिक लोगों को जोड़ते हैं तो यह स्केल नहीं होगा)। 2) मुझे इस संपादक / उपकरण को Xbox में चलाने में कोई दिलचस्पी नहीं है इसलिए Windows केवल समाधान काम करता है। 3) मुझे MSBuild विकल्पों के बारे में पता है लेकिन उन्हें पूर्ण XNA की आवश्यकता होती है

मैंने शॉन के ब्लॉग पर शोध किया और एमएसएनआईटी सैंपल या XNA 4.0 में एक नए विकल्प का उपयोग करने का विकल्प पाया जो यहां आशाजनक लग रहा था लेकिन ऐसा लगता है कि इसमें समान प्रतिबंध है: पूर्ण XNA GS को स्थापित करने की आवश्यकता है क्योंकि ContentPipeline XNA redist का हिस्सा नहीं है।

तो क्या किसी को इसके लिए वर्कअराउंड मिल गया है?

जवाबों:


11

इसका सही उत्तर की तरह लगता है कि ContentPipeline को छोड़ दें और Texture2D.FromStream का उपयोग करके रनटाइम पर बनावट को लोड करें। यह विधि एक पीसी में ठीक काम करती है और भले ही एक छोटा प्रदर्शन होगा हिट यह कुछ ऐसा है जिसे मैं रिलीज की तारीख के करीब होने पर अनुकूलित कर सकता हूं। अभी के लिए, संपादक और खेल दोनों के लिए सामग्री को गतिशील रूप से संशोधित करने की क्षमता होना वही है जिसकी मुझे आवश्यकता है। एक बार सामग्री जमी होने के बाद मैं इसे वापस ContentPipeline पर जाकर ऑप्टिमाइज़ कर सकता हूं।

चूंकि आपने इस मार्ग को चुना है, इसलिए मुझे आपको चेतावनी देनी चाहिए कि यह वास्तव में उतना सरल नहीं है जितना कि केवल Texture2D.FromStreamदो कारणों से उपयोग करना:

समस्या # 1 - पूर्व-गुणा अल्फा समर्थन का अभाव

XNA4 अब डिफ़ॉल्ट रूप से प्रीमियर अल्फा प्रारूप में रंगों के साथ बनावट को संभालता है। जब आप सामग्री पाइपलाइन के माध्यम से एक बनावट को लोड करते हैं, तो यह प्रसंस्करण आपके लिए स्वचालित रूप से किया जाता है। दुर्भाग्य से Texture2D.FromStreamएक ही काम नहीं करता है, इसलिए किसी भी बनावट को पारदर्शिता की कुछ डिग्री की आवश्यकता होती है जिसे गलत तरीके से लोड और प्रस्तुत किया जाएगा। समस्या का वर्णन करने के लिए नीचे एक स्क्रीनशॉट है:

यहाँ छवि विवरण दर्ज करें

तो सही परिणाम प्राप्त करने के लिए, आपको स्वयं प्रसंस्करण करने की आवश्यकता है। जिस विधि को मैं दिखाऊंगा वह प्रसंस्करण का काम करने के लिए GPU का उपयोग करता है इसलिए यह बहुत तेज़ है। यह इस महान लेख पर आधारित था । बेशक आप भी SpriteBatchपुराने NonPremultiplyAlpha मोड में प्रस्तुत करने का निर्देश दे सकते हैं, लेकिन मैं वास्तव में ऐसा करने की सलाह नहीं देता।

समस्या # 2 - असमर्थित प्रारूप

सामग्री पाइपलाइन की तुलना में अधिक स्वरूपों का समर्थन करती है Texture2D.FromStream। विशेष रूप से, Texture2D.FromStreamकेवल png, jpg और gif का समर्थन करता है। दूसरी ओर, सामग्री पाइपलाइन bmp, dds, dib, hdr, jpg, pfm, png, ppm और tga का समर्थन करती है। यदि आप एक अनुपलब्ध प्रारूप को लोड करने का प्रयास करते हैं, Texture2D.FromStreamतो आपको InvalidOperationExceptionथोड़ी अतिरिक्त जानकारी मिलेगी ।

मुझे वास्तव में अपने इंजन पर bmp समर्थन की आवश्यकता थी इसलिए उस विशेष मामले के लिए मुझे एक वर्कअराउंड मिला जो ठीक काम करने लगता है। हालांकि मैं किसी भी अन्य प्रारूप के बारे में नहीं जानता। मेरी विधि के साथ पकड़ यह है कि आपको System.Drawingअपनी परियोजना के लिए विधानसभा में एक संदर्भ जोड़ने की आवश्यकता है , क्योंकि यह जीडीआई का उपयोग Image.FromStreamकरता है जो कि अन्य प्रारूपों की तुलना में समर्थन करता है Texture2D.FromStream

यदि आप bmp के समर्थन के बारे में परवाह नहीं करते हैं, तो आप आसानी से मेरे समाधान के उस हिस्से को छोड़ सकते हैं और सिर्फ पूर्व-गुणा अल्फा प्रसंस्करण कर सकते हैं।

समाधान - सरल संस्करण (धीमा)

सबसे पहले, यहाँ सबसे आसान समाधान है यदि आप bmps का समर्थन करने के बारे में परवाह नहीं करते हैं। इस उदाहरण में प्रसंस्करण चरण पूरी तरह से सीपीयू पर किया जाता है। यह नीचे दिए गए विकल्प की तुलना में थोड़ा धीमा है (मैंने दोनों समाधानों को बेंचमार्क किया) लेकिन समझने में आसान:

public static Texture2D FromStream(GraphicsDevice graphicsDevice, Stream stream)
{
    Texture2D texture = Texture2D.FromStream(graphicsDevice, stream);
    Color[] data = new Color[texture.Width * texture.Height];
    texture.GetData(data);
    for (int i = 0; i != data.Length; ++i)
        data[i] = Color.FromNonPremultiplied(data[i].ToVector4());
    texture.SetData(data);
    return texture;
}

यदि आप bmps के बारे में परवाह करते हैं, तो आपको जिस चीज़ की ज़रूरत है, वह छवि को पहले GDI के साथ लोड करना है और फिर इसे पास करने से पहले आंतरिक रूप से PNG में बदलना है Texture2D.FromStream। यहाँ कोड है कि करता है:

// Load image using GDI because Texture2D.FromStream doesn't support BMP
using (Image image = Image.FromStream(stream))
{
    // Now create a MemoryStream which will be passed to Texture2D after converting to PNG internally
    using (MemoryStream ms = new MemoryStream())
    {
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        ms.Seek(0, SeekOrigin.Begin);
        texture = Texture2D.FromStream(_graphicsDevice, ms);
    }
}

समाधान - जटिल संस्करण (तेज़)

अंत में, मैं अपनी परियोजनाओं पर उपयोग होने वाला दृष्टिकोण इसके बजाय प्रसंस्करण करने के लिए GPU का उपयोग करना चाहता हूं। इस पद्धति में आपको एक रेंडर टारगेट बनाने की जरूरत है, कुछ मिश्रण राज्यों को ठीक से सेट करें, और एक स्प्राइटबैच के साथ दो बार छवि बनाएं। अंत में मैं पूरे RenderTarget2D पर जाता हूं और सामग्रियों को एक अलग Texture2D ऑब्जेक्ट में क्लोन करता हूं क्योंकि RenderTarget2D अस्थिर है और बैकबफ़र के आकार को बदलने जैसी चीज़ों से बचेगा नहीं, इसलिए इसे कॉपी बनाने के लिए सुरक्षित है।

मजेदार बात यह है कि इन सबके साथ भी, मेरे परीक्षणों में यह दृष्टिकोण सीपीयू दृष्टिकोण की तुलना में लगभग 3 गुना तेज है। तो यह प्रत्येक पिक्सेल पर जाने और रंग की गणना करने की तुलना में निश्चित रूप से तेज़ है। कोड थोड़ा लंबा है इसलिए मैंने इसे पास्टबिन में रखा:

http://pastie.org/3651642

बस उस वर्ग को अपनी परियोजना में जोड़ें, और इसे सरल रूप में प्रयोग करें:

TextureLoader textureLoader = new TextureLoader(GraphicsDevice);
Texture2D texture = textureLoader.FromFile("Content/texture.png");

नोट: आपको केवल TextureLoaderपूरे गेम के लिए एक उदाहरण बनाने की आवश्यकता है । इसके अलावा, मैं बीएमपी फिक्स का उपयोग कर रहा हूं, लेकिन आप इसे बाहर निकाल सकते हैं यदि आपको ज़रूरत नहीं है और प्रदर्शन का एक गुच्छा प्राप्त करें, या बस needsBmpपैरामीटर को गलत के रूप में छोड़ दें ।


वाह, यह बहुत अच्छा है! यह मुझे बहुत मदद करेगा :) बहुत बहुत धन्यवाद डेविड, मैं इसकी सराहना करता हूं।
krolth

+1 वास्तव में, मैं FromStreamआपके अन्य उदाहरण की तरह 32 बिट बिटमैप (png में सहेजा गया) वाली मेमोरी स्ट्रीम के साथ उपयोग कर रहा था , लेकिन इस पद्धति ने एक मुख्य बनावट नहीं बनाई। स्पष्ट रूप से प्रत्येक रंग की प्रबलता ने चाल चली, धन्यवाद।
Groo

3

मुझे लगता है कि अधिकांश टीमें अपने svn सर्वर (जो कि मुफ्त में सेट की जा सकती हैं) के लिए xnb परिवर्तन (ठीक है, सभी परिवर्तनों को वास्तव में xnb शामिल करता है) और अन्य (कलाकार, आदि) को अपनी स्वयं की कार्य प्रतियों को अपडेट करने की अनुमति देगा।

वास्तव में, यह कलाकार के लिए मूल (पूर्व- xnb) कला को नियंत्रित करने के लिए एक अच्छा तंत्र होगा। वह उसमें परिवर्तन करेगा, आप उसकी कार्यशील प्रति को अपडेट करेंगे, उसका निर्माण करेंगे (इसे प्रक्रिया में एक xnb बनाते हुए), आपके बदलावों को प्रतिबद्ध करेंगे, वह आपके कार्य की कार्य प्रतिलिपि को अद्यतन करता है और सभी में सभी परिवर्तन होते हैं। (आपके पास नवीनतम कच्ची कलाकृति है, उसके पास xnb (s) है।

यह तराजू बहुत अच्छी तरह से।


तो आप कह रहे हैं कि आपको नहीं लगता कि यह किया जा सकता है? आपका सुझाव XNB और स्प्राइट्स में संस्करण नियंत्रण जोड़ रहा है, हम पहले से ही ऐसा कर रहे हैं। लेकिन मुझे यह पसंद नहीं है क्योंकि मैं उनके लिए अड़चन बन जाता हूं। मैंने पहले से ही एनिमेशन को संपादित करने के लिए उनके लिए एक उपकरण लिखा था और वे उन्हें खेल में आज़मा सकते हैं। लेकिन अगर वे स्प्राइटशीट में बदलाव करते हैं, तो जब तक मैं इसे देखने से पहले इसे बना सकता हूं, तब तक इंतजार करना होगा। जैसा कि आप कल्पना कर सकते हैं कि यदि वे एक गलती करते हैं तो उन्हें फिर से करने की आवश्यकता होती है।
१२:१३

@krolth क्या यह एक बड़ी बात है कि आपके कलाकारों को एक प्रोजेक्ट पर काम करने के लिए वीएस एक्सप्रेस और एक्सएनएएनएएस मिलाने का एक हिस्सा है? मुझे लगता है कि इस बिंदु पर ट्रेडऑफ एक गाइड लिखने और इसके माध्यम से लोगों की मदद करने के लिए उत्पादकता को दूर कर देगा, क्योंकि अब कलाकार अपने काम को इंजन में नहीं देख सकते हैं। प्रक्रिया को सुव्यवस्थित करने के लिए, उन्हें एक .BAT फ़ाइल दें, जिसमें वे IDE को खोले बिना सब कुछ पुनः लिखने के लिए डबल-क्लिक कर सकते हैं। और अगर वे केवल ओएस एक्स चला रहे हैं, तो ठीक है, कठिन बकवास। खेल देव में आपका स्वागत है। वे अपने स्प्राइट्स कर सकते हैं और अगले प्रतिबद्ध एक्सएनबी की प्रतीक्षा कर सकते हैं।
michael.bartnett

यह इतनी बड़ी बात नहीं है, सिर्फ एक दर्द है। लेकिन मुझे लगता है कि यह करना होगा। आपके उत्तर / टिप्पणियों के लिए सभी को धन्यवाद!
क्राल्ट

1

मैं इसकी जांच करता रहा और किसी ऐसे व्यक्ति के लाभ के लिए इसे पोस्ट करूंगा जिसके पास एक ही सवाल है।

इस पर सही उत्तर की तरह लगता है कि ContentPipeline को छोड़ें और रनटाइम पर टेक्सचर को लोड करने के लिए Texture2D.FromStream का उपयोग करें । यह विधि एक पीसी में ठीक काम करती है और भले ही एक छोटा प्रदर्शन होगा हिट यह कुछ ऐसा है जिसे मैं रिलीज की तारीख के करीब होने पर अनुकूलित कर सकता हूं।

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


क्या आपने इसका सही परीक्षण किया है? मेरे अनुभव Texture2D.FromStreamसे ही काफी नहीं है। इसका कारण यह है कि चूंकि संस्करण 4 XNA प्रीफ़िल्टेड अल्फा टेक्सचर के साथ काम करता है, और जबकि सामग्री पाइपलाइन आपके लिए इस प्रसंस्करण का ध्यान रखता है, Texture2D.FromStreamइसलिए ऐसा नहीं होता कि आप संभवतः पारदर्शिता के साथ स्प्राइट्स खींचने पर समस्याओं में भाग लेंगे। यदि आप चाहें तो मैं एक कार्य समाधान पोस्ट कर सकता हूं।
डेविड गौवेया

इसके अलावा, सामग्री पाइपलाइन करते समय Texture2D.FromStreamलोडिंग .BMPफ़ाइलों का समर्थन नहीं करता है। यह एक ऐसी चीज है जो संभवत: आपको फेंक देगी यदि आपने .BMPपहले किसी संपत्ति का उपयोग किया था और फिर स्विच किया था Texture2D.FromStream। मेरे पास उस सीमा के लिए वर्कअराउंड भी है। मैं अभी आगे जाकर इसे पोस्ट करूंगा।
डेविड गौवेया

0

इस परियोजना की जाँच करें ।

यह आपके कलाकार को XNB को कुछ भी डिफ़ॉल्ट XNA सामग्री पाइपलाइन समर्थन के बारे में बनाने की अनुमति देगा। XNA फ्रेमवर्क पुनर्वितरण अभी भी आवश्यक है हालांकि आपके कलाकार को Visual Studio की आवश्यकता नहीं है।


सूचक के लिए धन्यवाद। कोड को देखते हुए ऐसा लगता है कि मैं उस Microsoft नमूने के संशोधन की तरह हूं जिसका मैंने संदर्भ दिया था। यह पूर्ण XNA गेम स्टूडियो स्थापित होने पर निर्भर करता है (देखें ContentBuilder.cs)। आप ऐसा क्यों सोचते हैं?

मुझे नहीं लगता कि यह नहीं है। अगर आप कंटेंट पाइपलाइन का उपयोग करना चाहते हैं तो आपके पास पूरा गेम स्टूडियो होना चाहिए। हालाँकि यह प्रोजेक्ट आपके कलाकारों को विज़ुअल स्टूडियो का उपयोग करने से रोकता है। सामग्री पाइपलाइन को फिर से लिखने के लिए केवल अन्य विकल्प।
क्लासिकथुंदर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.