এর সঠিক উত্তর বলে মনে হচ্ছে কনটেন্টপাইপলাইনটি এড়িয়ে যাওয়া এবং রানটাইম সময় টেক্সচার 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
প্যারামিটারটিকে মিথ্যা হিসাবে রেখে দিতে পারেন ।