সম্পূর্ণ এক্সএনএ জিএস ছাড়াই কোনও মেশিনে একটি ফাইল রফতানি করতে এক্সএনএ কনটেন্টপাইপলাইন ব্যবহার করা


9

আমার গেমটি রানটাইমে স্প্রিটশিটটি লোড করার জন্য সামগ্রী পাইপলাইন ব্যবহার করে। গেমের শিল্পী আমাকে পরিবর্তিত স্প্রিটশিট প্রেরণ করে এবং আমি আমার মেশিনে একটি বিল্ড করি এবং তাকে একটি আপডেট প্রকল্প প্রেরণ করি। সুতরাং আমি তার সম্পূর্ণ ম্যাসেজ স্টুডিও ইনস্টল না করেই তার মেশিনে এক্সএনবি ফাইলগুলি তৈরি করার উপায় খুঁজছি (এটি কনটেন্ট পাইপলাইনের আউটপুট)।

1) আমি চাই না যে আমার শিল্পী ভিএস + এক্সনা ইনস্টল করুন (আমি জানি ভিএস এর একটি মুক্ত সংস্করণ রয়েছে তবে আমরা দলে আরও লোক যুক্ত করলে এটি স্কেল হবে না)। 2) আমি এই সম্পাদক / সরঞ্জামটি এক্সবক্সে চালাতে আগ্রহী না তাই উইন্ডোজ কেবলমাত্র সমাধান কাজ করে। 3) আমি এমএসবিল্ড অপশন সম্পর্কে সচেতন তবে তাদের সম্পূর্ণ এক্সএনএ প্রয়োজন

আমি শনের ব্লগটি গবেষণা করেছি এবং এক্সএনএ ৪.০-তে এমসবিল্ড নমুনা বা একটি নতুন বিকল্প ব্যবহারের বিকল্পটি খুঁজে পেয়েছি যা এখানে আশাব্যঞ্জক বলে মনে হচ্ছে তবে মনে হচ্ছে এটির একই সীমাবদ্ধতা রয়েছে: সম্পূর্ণ এক্সএনএ জিএস ইনস্টল করা দরকার কারণ কন্টেন্টপাইপলাইন এক্সএনএ পুনরায় তালিকাভুক্তির অংশ নয়।

সুতরাং কেউ কি এর জন্য কোনও কাজের সন্ধান পেয়েছে?

উত্তর:


11

এর সঠিক উত্তর বলে মনে হচ্ছে কনটেন্টপাইপলাইনটি এড়িয়ে যাওয়া এবং রানটাইম সময় টেক্সচার 2 ডি ব্যবহার করুন rom এই পদ্ধতিটি একটি পিসিতে সূক্ষ্মভাবে কাজ করে এবং একটি ছোট পারফরম্যান্স হিট হলেও এটি প্রকাশের তারিখের কাছাকাছি আসার পরে আমি অনুকূলিত করতে পারি। আপাতত সম্পাদক এবং গেম উভয়ের জন্য বিষয়বস্তুকে গতিময়ভাবে সংশোধন করার দক্ষতা থাকা আমার প্রয়োজনের মতো। বিষয়বস্তু হিমশীতল হয়ে যাওয়ার পরে আমি কন্টেন্ট পাইপলাইনে ফিরে গিয়ে এটিকে অনুকূল করতে পারি।

যেহেতু আপনি এই রুটটি বেছে নিয়েছেন আমি আপনাকে অবশ্যই সতর্ক করেছিলাম যে এটি আসলে Texture2D.FromStreamদুটি কারণের জন্য ব্যবহারের মতো সহজ নয় :

সমস্যা # 1 - প্রাক গুণিত আলফা সমর্থনের অভাব

এক্সএনএ 4 এখন ডিফল্টরূপে প্রিমিপ্লিটপ্লাইড আলফা ফর্ম্যাটে রঙের সাথে টেক্সচারগুলি পরিচালনা করে। আপনি যখন বিষয়বস্তু পাইপলাইনের মাধ্যমে কোনও টেক্সচার লোড করেন, সেই প্রক্রিয়াটি স্বয়ংক্রিয়ভাবে আপনার জন্য হয়ে যায়। দুর্ভাগ্যক্রমে Texture2D.FromStreamএকই জিনিসটি করা হয় না, সুতরাং কোনও পাঠ্যের জন্য কিছুটা স্বচ্ছতার প্রয়োজন হয় লোড করা হবে এবং ভুলভাবে রেন্ডার করা হবে। সমস্যাটি চিত্রিত করার জন্য নীচে একটি স্ক্রিনশট দেওয়া হল:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং সঠিক ফলাফল পেতে আপনার নিজের প্রক্রিয়াটি নিজেই করা উচিত। আমি যে পদ্ধতিটি দেখাব তা প্রসেসিং করতে GPU ব্যবহার করে তাই এটি খুব দ্রুত। এটি এই দুর্দান্ত নিবন্ধের ভিত্তিতে তৈরি হয়েছিল । অবশ্যই আপনি SpriteBatchপুরানো ননপ্রিমুটলিপ্লিআল্ফা মোডে রেন্ডার করার নির্দেশ দিতে পারেন তবে আমি সত্যিই এটি করার পরামর্শ দিচ্ছি না।

সমস্যা # 2 - অসমর্থিত ফর্ম্যাটগুলি

সামগ্রী পাইপলাইন এর চেয়ে বেশি ফর্ম্যাটগুলিকে সমর্থন করে Texture2D.FromStream। বিশেষত, Texture2D.FromStreamকেবলমাত্র png, jpg এবং gif সমর্থন করে supports অন্যদিকে, সামগ্রী পাইপলাইনটি বিএমপি, ডিডিএস, ডিবি, এইচডিআর, জেপিজি, পিএফএম, পিএনজি, পিপিএম এবং টিজি সমর্থন করে। আপনি একটি usuported বিন্যাস লোড করতে চেষ্টা করুন মাধ্যমে Texture2D.FromStreamআপনি একটি পাবেন InvalidOperationExceptionসামান্য অতিরিক্ত তথ্য সমেত।

আমার ইঞ্জিনে আমার সত্যিই বিএমপি সমর্থন দরকার ছিল সুতরাং সেই বিশেষ ক্ষেত্রে আমি এমন একটি কাজের সন্ধান পেয়েছি যা ঠিক আছে বলে মনে হচ্ছে। যদিও আমি অন্য কোনও ফর্ম্যাট সম্পর্কে জানি না। আমার পদ্ধতির সাহায্যে ধরা হচ্ছে 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 এর সাথে চিত্রটি লোড এবং তারপর পিএনজি রূপান্তর অভ্যন্তরীণভাবে এটি ক্ষণস্থায়ী আগে 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 এর পরিবর্তে প্রসেসিংয়ের জন্য ব্যবহার করা। এই পদ্ধতিতে আপনাকে রেন্ডার লক্ষ্য তৈরি করতে হবে, কিছু মিশ্রিত অবস্থা সঠিকভাবে সেট আপ করতে হবে এবং একটি স্প্রিটব্যাচ দিয়ে চিত্রটি দু'বার আঁকতে হবে। শেষে আমি পুরো রেন্ডারটারজিট 2 ডি পেরিয়ে সামগ্রীগুলি একটি আলাদা টেক্সচার 2 ডি অবজেক্টে ক্লোন করেছি কারণ রেন্ডারটারেজ 2 ডিটি অস্থির এবং ব্যাকবফার আকার পরিবর্তন করার মতো জিনিসগুলি টিকিয়ে রাখে না যাতে এটি অনুলিপি করা নিরাপদ।

মজার বিষয় হ'ল এই সমস্ত কিছুর পরেও, আমার পরীক্ষাগুলিতে এই পদ্ধতিটি সিপিইউ পদ্ধতির চেয়ে প্রায় 3 গুণ বেশি দ্রুত সম্পাদিত হয়েছিল। সুতরাং এটি প্রতিটি পিক্সেল পেরিয়ে রঙ নিজেই গণনার চেয়ে স্পষ্টতই দ্রুত। কোডটি বেশ লম্বা তাই আমি এটি একটি পেস্টবিনে রেখেছি:

http://pastie.org/3651642

আপনার প্রকল্পে কেবল সেই শ্রেণিটি যুক্ত করুন এবং এটি এতটা সহজ হিসাবে ব্যবহার করুন:

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

দ্রষ্টব্য: TextureLoaderআপনার পুরো গেমটির জন্য কেবল একটি উদাহরণ তৈরি করতে হবে । এছাড়াও আমি বিএমপি ফিক্সটি ব্যবহার করছি তবে আপনার যদি প্রয়োজন না হয় এবং একগুচ্ছ পারফরম্যান্স অর্জন না করেন তবে আপনি needsBmpপ্যারামিটারটিকে মিথ্যা হিসাবে রেখে দিতে পারেন ।


বাহ, এই দুর্দান্ত! এটি আমাকে অনেক সাহায্য করবে :) অনেক ধন্যবাদ ডেভিড, আমি এটির প্রশংসা করি।
krolth

+1 প্রকৃতপক্ষে, আমি FromStreamআপনার অন্যান্য উদাহরণের মতো, 32 বিট বিটম্যাপযুক্ত একটি মেমরি স্ট্রিম ব্যবহার করছিলাম (পিএনজি-তে সংরক্ষিত), তবে এই পদ্ধতিটি একটি প্রিম্টিপ্লাইটিড টেক্সচার তৈরি করে নি। প্রতিটি রঙের স্পষ্টতই প্রাক্কলিতভাবে কৌতুক করেছে, ধন্যবাদ।
গ্রো

3

আমি মনে করি বেশিরভাগ দলগুলি তাদের এসএনএন সার্ভারে (এক্সপ্লোর পরিচালনা হিসাবে সমস্ত পরিবর্তনগুলি সত্যই, এক্সএনবি অন্তর্ভুক্ত) এবং অন্যকে (শিল্পী, ইত্যাদি) তাদের নিজস্ব কপি অনুলিপিগুলি আপডেট করার অনুমতি দেবে।

প্রকৃতপক্ষে, শিল্পী সংস্করণটির মূল (প্রাক xnb) সংস্করণটি নিয়ন্ত্রণ করার জন্য এটি একটি ভাল প্রক্রিয়া হবে। তিনি এতে পরিবর্তন আনবেন, আপনি এটির আপনার কার্যকরী অনুলিপি আপডেট করবেন, এটি তৈরি করবেন (এটি প্রক্রিয়াটিকে এক্সএনবি বানিয়ে দেবেন), আপনার পরিবর্তনগুলি প্রতিশ্রুতিবদ্ধ করবেন, তিনি আপনার কাজের প্রতিলিপি আপডেট করবেন এবং প্রত্যেকেরই সমস্ত পরিবর্তন রয়েছে। (আপনার কাছে সর্বশেষ কাঁচা শিল্পকর্ম রয়েছে, তাঁর এক্সএনবি রয়েছে)।

এই স্কেল খুব ভাল।


সুতরাং আপনি বলছেন যে আপনি এটি করা যেতে পারে বলে মনে করেন না? আপনার পরামর্শটি এক্সএনবি এবং স্প্রাইটে সংস্করণ নিয়ন্ত্রণ যুক্ত করছে, আমরা ইতিমধ্যে এটি করছি। তবে আমি এটি পছন্দ করি না কারণ আমি তাদের জন্য বাধা হয়ে উঠি। আমি তাদের জন্য অ্যানিমেশনগুলি সম্পাদনা করার জন্য ইতিমধ্যে একটি সরঞ্জাম লিখেছি এবং তারা সেগুলি এগুলি খেলতে চেষ্টা করতে পারে। তবে যদি তারা স্প্রিটশিটে পরিবর্তন করে তবে তাদের এটি দেখার আগে আমি এটি তৈরি না হওয়া পর্যন্ত তাদের অপেক্ষা করতে হবে। যেমন আপনি কল্পনা করতে পারেন যে তারা যদি ভুল করে থাকে তবে তাদের আবার এটি করা দরকার।
krolth

@ ক্রলথ আপনার শিল্পীদের কোনও প্রকল্পে কাজ করার জন্য সেটআপ করার অংশ হিসাবে ভিটিএস এক্সপ্রেস এবং এক্সএনএ পাওয়ার জন্য এটি কি খুব বড় চুক্তি? আমি মনে করি এই মুহুর্তে একটি গাইড লিখতে হবে এবং এর মাধ্যমে লোকদের সহায়তা করতে হবে এমন ট্রেড অফ এখন আপনার যে উত্পাদনশীলতা হারাচ্ছে তার চেয়ে অনেক বেশি হবে যেহেতু শিল্পীরা তাদের ইঞ্জিনটি ইঞ্জিনটি দেখতে পাচ্ছেন না। প্রক্রিয়াটি প্রবাহিত করতে, তাদের একটি .BAT ফাইল দিন যা তারা আইডিই না খোলায় সবকিছু পুনরায় সংযোগ করতে ডাবল-ক্লিক করতে পারেন। এবং যদি তারা কেবল ওএস এক্স চালাচ্ছে, ভাল, শক্ত ছিটে। খেলা দেব আপনাকে স্বাগতম। তারা তাদের স্প্রিট করতে পারে এবং পরবর্তী প্রতিশ্রুতিবদ্ধ এক্সএনবিগুলির জন্য অপেক্ষা করতে পারে।
michael.bartnett

এটি এত বড় ব্যাপার নয়, কেবল একটি ব্যথা। তবে আমার ধারণা এটি করতে হবে। আপনার উত্তর / মন্তব্যের জন্য সবাইকে ধন্যবাদ!
krolth

1

আমি এটি তদন্ত করে চলেছি এবং একই প্রশ্ন রয়েছে এমন কারও উপকারের জন্য এটি পোস্ট করব।

এর সঠিক উত্তর বলে মনে হচ্ছে কনটেন্টপাইপলাইনটি এড়িয়ে যাওয়া এবং রানটাইম সময় টেক্সচার 2 ডি ব্যবহার করুন rom এই পদ্ধতিটি একটি পিসিতে সূক্ষ্মভাবে কাজ করে এবং একটি ছোট পারফরম্যান্স হিট হলেও এটি প্রকাশের তারিখের কাছাকাছি আসার পরে আমি অনুকূলিত করতে পারি।

আপাতত সম্পাদক এবং গেম উভয়ের জন্য বিষয়বস্তুকে গতিময়ভাবে সংশোধন করার দক্ষতা থাকা আমার প্রয়োজনের মতো। বিষয়বস্তু হিমশীতল হয়ে যাওয়ার পরে আমি কন্টেন্ট পাইপলাইনে ফিরে গিয়ে এটিকে অনুকূল করতে পারি।


আপনি কি এটি সঠিকভাবে পরীক্ষা করেছেন? Texture2D.FromStreamনিজে থেকে আমার অভিজ্ঞতা থেকে যথেষ্ট নয়। এর কারণটি হ'ল সংস্করণ 4 এক্সএনএ প্রিম্টিপ্লাইটিড আলফা টেক্সচারের সাথে কাজ করে এবং সামগ্রী পাইপলাইনটি স্বয়ংক্রিয়ভাবে আপনার জন্য এই প্রক্রিয়াজাতকরণের যত্ন নেয় তবে স্বচ্ছতার সাথে স্প্রিটস আঁকলে আপনি সম্ভবত সমস্যায় পড়বেন Texture2D.FromStreamনা। আপনি যদি চাই তবে আমি একটি কার্যনির্বাহী সমাধান পোস্ট করতে পারি।
ডেভিড গাউভিয়া

এছাড়াও, সামগ্রী পাইপলাইন করার সময় ফাইলগুলি Texture2D.FromStreamলোড .BMPকরা সমর্থন করে না । এটি এমন কিছু যা আপনি যদি .BMPআগে কোনও সম্পদ ব্যবহার করেন এবং তারপরে স্যুইচ করেন তবে সম্ভবত আপনাকে তাড়িয়ে দেবে Texture2D.FromStream। আমারও সেই সীমাবদ্ধতার জন্য একদম কাজ আছে। আমি শুধু এগিয়ে যান এবং এটি পোস্ট করব।
ডেভিড গাউভিয়া

0

এই প্রকল্পটি দেখুন ।

এটি আপনার শিল্পীকে ডিফল্ট এক্সএনএ বিষয়বস্তু পাইপলাইন সমর্থন করে এমন কোনও কিছু থেকে এক্সএনবি তৈরি করার অনুমতি দেবে। আপনার শিল্পীর ভিজ্যুয়াল স্টুডিওর প্রয়োজন না থাকলেও এক্সএনএ কাঠামো পুনরায় বিতরণযোগ্য এখনও প্রয়োজনীয়।


পয়েন্টারের জন্য ধন্যবাদ। কোডটির দিকে তাকানো দেখে মনে হচ্ছে যে মাইক্রোসফ্ট নমুনাটি আমি উল্লেখ করেছি তাতে কোনও পরিবর্তন হয়েছে। এটি সম্পূর্ণ এক্সএনএ গেম স্টুডিও ইনস্টল করার উপর নির্ভর করে (কন্টেন্টবিল্ডার.সি দেখুন)। আপনি কেন ভাবেন না?
krolth

আমি মনে করি না এটা হয় না। আপনি যদি সামগ্রী পাইপলাইনটি ব্যবহার করতে চান তবে আপনার সম্পূর্ণ গেম স্টুডিও থাকতে হবে। তবে প্রকল্পটি আপনার শিল্পীদের ভিজ্যুয়াল স্টুডিও ব্যবহার করতে বাধা দেয়। বিষয়বস্তু পাইপলাইনটি পুনরায় লেখার জন্য কেবলমাত্র অন্যান্য বিকল্প।
ক্লাসিকথান্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.