আমি কোনও সম্পদ পরিচালক হিসাবে চিন্তা না করে শুরু করব । আপনার আর্কিটেকচার সম্পর্কে স্বল্প-সংজ্ঞায়িত পদগুলিতে চিন্তা করা (যেমন "ম্যানেজার") আপনাকে মানসিকভাবে রাগের নিচে অনেকগুলি বিশদ ঝুঁকতে দেয় এবং ফলস্বরূপ কোনও সমাধানে স্থির হওয়া আরও কঠিন হয়ে যায়।
আপনার নির্দিষ্ট প্রয়োজনগুলিতে ফোকাস করুন যা অন্তর্নিহিত উত্স সঞ্চয়স্থানের বিমোচন করে এমন একটি সংস্থান লোড মেকানিজম তৈরির ক্ষেত্রে যা ঘটেছে বলে মনে হচ্ছে এবং সমর্থিত প্রকারের সেটটির সম্প্রসারণযোগ্যতার অনুমতি দেয়। আপনার প্রশ্নে সত্যিকার অর্থে কিছুই নেই, উদাহরণস্বরূপ, ইতিমধ্যে লোড হওয়া সংস্থানসমূহের ক্যাচিং - যা ভাল, কারণ একক-দায়িত্বের নীতি অনুসরণ করে আপনার সম্ভবত একটি পৃথক সত্তা হিসাবে একটি সম্পদ ক্যাশে তৈরি করা উচিত এবং অন্য কোথাও দুটি ইন্টারফেসকে একত্রিত করা উচিত, , উপযুক্ত.
আপনার নির্দিষ্ট উদ্বেগের সমাধানের জন্য, আপনার লোডারটি এমনভাবে ডিজাইন করা উচিত যাতে এটি কোনও সম্পদের লোড নিজেই না করে, বরং নির্দিষ্ট ধরণের সম্পদ লোড করার জন্য ইন্টারফেসগুলিতে সেই দায়িত্ব অর্পণ করে। উদাহরণ স্বরূপ:
interface ITypeLoader {
object Load (Stream assetStream);
}
আপনি নতুন ক্লাস তৈরি করতে পারেন যা এই ইন্টারফেসটি বাস্তবায়িত করে, প্রতিটি নতুন শ্রেণি একটি প্রবাহ থেকে নির্দিষ্ট ধরণের ডেটা লোড করার জন্য তৈরি করা হয়। একটি স্ট্রিম ব্যবহার করে, টাইপ লোডারটি একটি সাধারণ, স্টোরেজ-অজোনস্টিক ইন্টারফেসের বিপরীতে লেখা যেতে পারে এবং ডিস্ক বা ডাটাবেস থেকে লোড করার জন্য হার্ড কোডিং করতে হবে না; এমনকি এটি আপনাকে নেটওয়ার্ক স্ট্রিমগুলি থেকে আপনার সম্পদগুলি লোড করার অনুমতি দেয় (যা কোনও নেটওয়ার্ক-সংযুক্ত পিসিতে আপনার গেমটি কনসোল এবং আপনার সম্পাদনা সরঞ্জামগুলিতে চলছে তখন সম্পদের হট-রিলোডিং বাস্তবায়নে খুব কার্যকর হতে পারে)।
আপনার মূল সম্পদ লোডারকে এই ধরণের-নির্দিষ্ট লোডারগুলি নিবন্ধন করতে এবং ট্র্যাক করতে সক্ষম হতে হবে:
class AssetLoader {
public void RegisterType (string key, ITypeLoader loader) {
loaders[key] = loader;
}
Dictionary<string, ITypeLoader> loaders = new Dictionary<string, ITypeLoader>();
}
এখানে ব্যবহৃত "কী" আপনার পছন্দমতো হতে পারে - এবং এটির স্ট্রিং হওয়া দরকার নয় তবে এগুলি শুরু করা সহজ। কীভাবে আপনি কোনও ব্যবহারকারী কোনও নির্দিষ্ট সম্পদ সনাক্ত করতে পারেন এবং উপযুক্ত লোডারটি সন্ধান করতে ব্যবহৃত হবে তার মূল কীটি আপনাকে বিবেচনা করবে। যেহেতু আপনি বাস্তবায়নটি কোনও ফাইল সিস্টেম বা একটি ডেটাবেস ব্যবহার করছে তা এই সত্যটি আড়াল করতে চান, আপনার কোনও ফাইল সিস্টেমের পাথ বা এর মতো কিছু দ্বারা সম্পত্তির উল্লেখকারী ব্যবহারকারী থাকতে পারে না।
ব্যবহারকারীদের খালি ন্যূনতম তথ্য সহ একটি সম্পদ উল্লেখ করা উচিত। কিছু ক্ষেত্রে, কেবলমাত্র একটি ফাইলের নামই যথেষ্ট হবে তবে আমি খুঁজে পেয়েছি যে প্রায়শই কোনও প্রকার / নাম জুটি ব্যবহার করা বাঞ্ছনীয় যাতে সবকিছু খুব স্পষ্ট থাকে। সুতরাং, কোনও ব্যবহারকারী আপনার অ্যানিমেশন এক্সএমএল ফাইলগুলির একটি হিসাবে চিহ্নিত উদাহরণটিকে উল্লেখ করতে পারে "AnimationXml","PlayerWalkCycle"
।
এখানে, AnimationXml
আপনি কী নিবন্ধভুক্ত করেছেন AnimationXmlLoader
, কী প্রয়োগ করবে সে কী হবে IAssetLoader
। স্পষ্টতই, PlayerWalkCycle
নির্দিষ্ট সম্পদ চিহ্নিত করে। একটি প্রকারের নাম এবং একটি সংস্থান নাম দেওয়া হয়েছে, আপনার সম্পদ লোডার সেই সম্পত্তির কাঁচা বাইটের জন্য এটির অবিচ্ছিন্ন স্টোরেজটি জিজ্ঞাসা করতে পারে। যেহেতু আমরা এখানে সর্বাধিক সাধারণতার জন্য যাচ্ছি, আপনি যখন এটি তৈরি করবেন তখন লোডারটিকে স্টোরেজ অ্যাক্সেসের একটি মাধ্যমটি পাস করার মাধ্যমে আপনি এটি প্রয়োগ করতে পারেন, আপনাকে স্ট্রোম মিডিয়ামটি এমন কোনও কিছু দিয়ে প্রতিস্থাপন করতে দেয় যা পরবর্তীতে স্ট্রিম সরবরাহ করতে পারে:
interface IAssetStreamProvider {
Stream GetStream (string type, string name);
}
class AssetLoader {
public AssetLoader (IAssetStreamProvider streamProvider) {
provider = streamProvider;
}
object LoadAsset (string type, string name) {
var loader = loaders[type];
var stream = provider.GetStream(type, name);
return loader.Load(stream);
}
public void RegisterType (string type, ITypeLoader loader) {
loaders[type] = loader;
}
IAssetStreamProvider provider;
Dictionary<string, ITypeLoader> loaders = new Dictionary<string, ITypeLoader>();
}
খুব সাধারণ স্ট্রিম সরবরাহকারী নামের একটি সাবডাইরেক্টরির জন্য সুনির্দিষ্ট একটি সম্পদ মূল ডিরেক্টরিটি দেখবেন এবং type
ফাইলটির কাঁচা বাইটগুলি name
একটি স্ট্রিমের মধ্যে লোড করে এটি ফিরিয়ে আনবেন ।
সংক্ষেপে, আপনার এখানে যা আছে একটি সিস্টেম যেখানে:
- একটি শ্রেণি রয়েছে যা জানে যে কোনও ধরণের ব্যাকএন্ড স্টোরেজ (একটি ডিস্ক, একটি ডাটাবেস, একটি নেটওয়ার্ক স্ট্রিম, যাই হোক না কেন) থেকে কাঁচা বাইটগুলি কীভাবে পড়তে হয়।
- এমন কোনও ক্লাস রয়েছে যা কীভাবে কাঁচা বাইট স্ট্রিমটি নির্দিষ্ট ধরণের উত্সে পরিণত করতে এবং এটি ফিরিয়ে আনতে জানে।
- আপনার প্রকৃত "সম্পদ লোডার" এর উপরের উপরেরগুলির একটি সংকলন রয়েছে এবং কীভাবে প্রবাহ সরবরাহকারীর আউটপুটটি টাইপ-নির্দিষ্ট লোডারে পাইপ করতে হয় এবং এইভাবে একটি কংক্রিট সম্পদ উত্পাদন করতে পারে তা জানে। স্ট্রিম সরবরাহকারী এবং প্রকার-নির্দিষ্ট লোডারগুলিকে কনফিগার করার উপায়গুলি প্রকাশ করে, আপনার কাছে এমন একটি সিস্টেম রয়েছে যা ক্লায়েন্ট (বা নিজেরাই) দ্বারা প্রকৃত সম্পদ লোডার কোডটি পরিবর্তন না করেই বাড়ানো যেতে পারে।
কিছু সাবধানতা এবং চূড়ান্ত নোট:
উপরের কোডটি মূলত সি #, তবে সর্বনিম্ন প্রচেষ্টা সহ যে কোনও ভাষায় অনুবাদ করা উচিত। এটির সুবিধার্থে আমি ত্রুটি যাচাই বা সঠিকভাবে ব্যবহার IDisposable
এবং অন্যান্য আইডিয়ামগুলি সরাসরি অন্য ভাষায় প্রয়োগ নাও করতে পারে এমন অনেকগুলি বিষয় বাদ দিয়েছি । সেগুলি পাঠকের জন্য হোমওয়ার্ক হিসাবে রেখে গেছে।
একইভাবে, আমি object
উপরে হিসাবে কংক্রিট সম্পদটি ফিরিয়ে দিচ্ছি , তবে আপনি জেনেরিকস বা টেম্পলেটগুলি ব্যবহার করতে পারেন বা পছন্দসই কোনও নির্দিষ্ট-নির্দিষ্ট বস্তুর প্রকারের যা কিছু তৈরি করতে পারেন (আপনার উচিত, এটির সাথে কাজ করা ভাল)।
উপরের হিসাবে, আমি এখানে সমস্ত কিছু ক্যাশে করার সাথে মোকাবিলা করি না। তবে আপনি সহজে এবং একই ধরণের সাধারণতা এবং কনফিগারেশনে ক্যাচিং যুক্ত করতে পারেন। চেষ্টা করে দেখুন!
এটি করার জন্য প্রচুর এবং প্রচুর এবং প্রচুর উপায় রয়েছে এবং অবশ্যই কোনও উপায় বা sensক্যমত্য নেই, যার কারণে আপনি কোনও খুঁজে পেতে সক্ষম হন নি। আমি এই উত্তরটিকে বেদনাদায়ক দীর্ঘ প্রাচীরের কোডে পরিণত না করে নির্দিষ্ট পয়েন্টগুলি পেতে যথেষ্ট কোড সরবরাহ করার চেষ্টা করেছি। এটি ইতিমধ্যে এটি অত্যন্ত দীর্ঘ। আপনার যদি স্পষ্ট করার প্রশ্ন থাকে তবে নির্দ্বিধায় মন্তব্য করতে বা আমাকে চ্যাটে সন্ধান করুন ।