আমি কীভাবে একটি এক্সটেনসিবল এ্যাসেট লোডিং সিস্টেম গঠন করব?


19

জাভাতে শখের গেম ইঞ্জিনের জন্য, আমি একটি সাধারণ তবে নমনীয় সম্পদ / সংস্থান পরিচালককে কোড করতে চাই। সম্পদগুলি হ'ল শব্দ, চিত্র, অ্যানিমেশন, মডেল, টেক্সচার এবং ইত্যাদি are কয়েক ঘন্টা ব্রাউজিং এবং কিছু কোড পরীক্ষার পরে আমি এখনও এই জিনিসটি কীভাবে ডিজাইন করব তা নিশ্চিত নই sure

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

আমি তথ্য অনেক খুঁজে পেতে পারেন কি একটি সম্পদ ব্যবস্থাপক করা উচিত, কিন্তু না কিভাবে এটা করতে। জেনারিকদের জড়িতদের ফলাফলগুলি একরকম শ্রেণীর ক্যাসকেডিং বা কোনওরকম সহায়ক সহায়ক শ্রেণীর ফলাফল হিসাবে দেখা দেয়। তবে আমি এমন একটি পরিষ্কার উদাহরণ দেখিনি যা ব্যক্তিগত হ্যাক, বা sensকমত্যের মত লাগে না।

উত্তর:


23

আমি কোনও সম্পদ পরিচালক হিসাবে চিন্তা না করে শুরু করব । আপনার আর্কিটেকচার সম্পর্কে স্বল্প-সংজ্ঞায়িত পদগুলিতে চিন্তা করা (যেমন "ম্যানেজার") আপনাকে মানসিকভাবে রাগের নিচে অনেকগুলি বিশদ ঝুঁকতে দেয় এবং ফলস্বরূপ কোনও সমাধানে স্থির হওয়া আরও কঠিন হয়ে যায়।

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

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

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


1
উত্তম প্রশ্ন এবং উত্তরের উত্তর যা কেবলমাত্র একটি ডেটা চালিত নকশার দিকে নয় বরং কীভাবে ডেটাচালিত উপায়ে চিন্তাভাবনা শুরু
প্যাট্রিক হিউজেস

খুব সুন্দর এবং গভীর উত্তর। আপনি আমার প্রশ্নটি কীভাবে ব্যাখ্যা করেছেন এবং আমি এটি খুব খারাপভাবে প্রণয়ন করার সময় আমাকে যা জানার দরকার ছিল তা আমাকে বলেছি love ধন্যবাদ! যে কোনও সুযোগে, আপনি কি আমাকে স্ট্রিম সম্পর্কে কিছু সংস্থান সম্পর্কে নির্দেশ করতে পারেন?
ব্যবহারকারীর 8363

একটি "স্ট্রিম" হ'ল বাইটস বা ডেটার একটি সিক্যুয়েন্স (সম্ভাব্য কোনও নির্ধারণযোগ্য শেষ সহ)। আমি বিশেষত সি # এর স্ট্রিমটি নিয়ে ভাবছিলাম , তবে আপনি সম্ভবত জাভা প্রবাহের ক্লাসে আরও আগ্রহী - যদিও সতর্ক করা হয়েছে আমি খুব বেশি জাভা জানি না যাতে এটি ব্যবহারের জন্য আদর্শ শ্রেণি নাও হতে পারে।

স্ট্রিমগুলি সাধারণত স্থিতিযুক্ত, কোনও প্রদত্ত স্ট্রিম অবজেক্টের সাধারণত স্রোতের মধ্যে একটি বর্তমান পঠন বা লেখার অবস্থান থাকে এবং আপনি এতে সম্পাদন করেন এমন কোনও আইও সেই অবস্থান থেকেই ঘটে - এজন্য আমি তাদের উপরের সম্পদ ইন্টারফেসের ইনপুট হিসাবে ব্যবহার করেছি, কারণ তারা মূলত "এখানে কিছু কাঁচা ডেটা এবং কোথা থেকে পড়া শুরু করবেন, তা থেকে পড়ুন এবং আপনার জিনিসটি করুন" বলছেন।

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