কীভাবে একটি এসেটম্যানেজার ডিজাইন করবেন?


26

কোনও গেমের গ্রাফিক্স, শব্দ ইত্যাদির রেফারেন্স ধরে রাখবে এমন অ্যাসিস্টম্যানেজার ডিজাইনের সেরা পন্থাটি কী?

এই সম্পদগুলি কী / মান মানচিত্রের জোড়ায় সংরক্ষণ করা উচিত? আমি কি "পটভূমি" সম্পদ জিজ্ঞাসা করি এবং মানচিত্রটি যুক্ত বিটম্যাপটি দেয়? এর চেয়েও ভাল উপায় কি আছে?

বিশেষত আমি একটি অ্যান্ড্রয়েড / জাভা গেম লিখছি, তবে উত্তরগুলি জেনেরিক হতে পারে।

উত্তর:


16

এটি আপনার গেমের সুযোগের উপর নির্ভর করে। বড় সম্পদের জন্য কোনও সম্পদ ব্যবস্থাপক একেবারে প্রয়োজনীয়, ছোট গেমগুলির জন্য কম।

বৃহত্তর শিরোনামগুলির জন্য আপনাকে নীচের মতো সমস্যাগুলি পরিচালনা করতে হবে:

  • ভাগ করা সম্পদ - ইটের টেক্সচারটি কি একাধিক মডেল ব্যবহার করছে?
  • সম্পদকালীন আজীবন - 15 মিনিট আগে যে সম্পদটি আপনি লোড করেছিলেন তা কি আর দরকার নেই? ইত্যাদির সাথে কিছু শেষ হয়ে গেলে আপনি জানেন কিনা তা নিশ্চিত করার জন্য আপনার সম্পদ গণনা করার রেফারেন্স
  • ডাইরেক্টএক্স 9-এ যদি কিছু সম্পদের ধরণের লোড হয় এবং আপনার গ্রাফিক্স ডিভাইসটি 'হারিয়ে' যায় (আপনি যদি অন্য জিনিসগুলির মধ্যে Ctrl + Alt + Del চাপেন তবে এটি ঘটে) - আপনার গেমটি সেগুলি পুনরায় তৈরি করতে হবে
  • সম্পদগুলির প্রয়োজনের আগেই লোড হচ্ছে - আপনি এটি ছাড়া বড় বড় ওপেন ওয়ার্ল্ড গেম তৈরি করতে পারবেন না
  • বাল্ক লোডিং সম্পদ - লোডিংয়ের সময়ের উন্নতি করার জন্য আমরা প্রায়শই একক ফাইলে প্রচুর সম্পদ প্যাক করি - ডিস্কের সন্ধান করা খুব সময় ব্যয়কারী

ছোট ছোট শিরোনামগুলির জন্য এই জিনিসগুলি কোনও ইস্যু কম নয়, এক্সএনএর মতো ফ্রেমওয়ার্কগুলিতে তাদের মধ্যে সম্পদ পরিচালক রয়েছে - এটি পুনরায় উদ্ভাবনের খুব কম বিষয় রয়েছে।

আপনি যদি নিজেকে সম্পদ ব্যবস্থাপকের প্রয়োজন বলে মনে করেন তবে সত্যিকার অর্থে কোনও এক-আকারের ফিট-সব সমাধান নেই, তবে আমি খুঁজে পেয়েছি যে ফাইলের নামের একটি হ্যাশ * হিসাবে কী সহ একটি হ্যাশ মানচিত্র রয়েছে (নিম্ন এবং পৃথককারীরা সমস্ত 'স্থির') আমি যে প্রকল্পগুলিতে কাজ করেছি তার জন্য ভাল কাজ করে।

আপনার অ্যাপ্লিকেশনটিতে হার্ডকোড ফাইলের নামগুলি সাধারণত পরামর্শ দেওয়া হয় না, সাধারণত অন্য আইডি ফর্ম্যাট (যেমন এক্সএমএল) ফাইল আইডিকে 'আইডি' হিসাবে চিত্রিত করা ভাল।

  • মজাদার দিকের নোট হিসাবে আপনি সাধারণত প্রতি প্রকল্পে একটি হ্যাশের সংঘর্ষ পান।

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

2
@ জো র্রেছনিগ - আপনি কোনও সম্পদ পরিচালক ব্যবহার না করে আইসিস্ট্যাটিক দ্বারা উল্লিখিত পাঁচটি প্রয়োজনীয়তা কীভাবে মোকাবেলা করবেন?
এন্টিনোম

8

(এখানে "কোনও সম্পদ ব্যবস্থাপক ব্যবহার করবেন না" এড়িয়ে চলার চেষ্টা করছি-যেহেতু আমি এটি অফটোপিক বিবেচনা করি))

একটি কী / মানচিত্র একটি খুব ব্যবহারযোগ্য পদ্ধতির।

আমাদের একটি রিসোর্স ম্যানেজার বাস্তবায়ন রয়েছে যেখানে বিভিন্ন রিসোর্স ধরণের কারখানাগুলি নিবন্ধন করতে পারে।

"GetResource" পদ্ধতিটি ওয়ান্টেড রিসোর্স টাইপের সঠিক ফ্যাক্টরি সন্ধানের জন্য টেমপ্লেট ব্যবহার করে এবং একটি নির্দিষ্ট রিসোর্স হ্যান্ডেল দেয় (আবার একটি স্পেসিফিক রিসোর্সহ্যান্ডেল ফেরত দেওয়ার জন্য টেমপ্লেট ব্যবহার করে)।

সংস্থানগুলি রিসোর্স ম্যানেজার (রিসোর্স হ্যান্ডেলের অভ্যন্তরে) দ্বারা পুনরায় হিসাব করা হয় এবং যখন তাদের আর প্রয়োজন হয় না তখন প্রকাশ করা হয়।

আমরা লিখেছি প্রথম অ্যাডন ছিল "রিলোড (XYZ)" পদ্ধতি, যা আমাদের কোনও কোড পরিবর্তন না করে এবং গেমটি পুনরায় লোড না করে চলমান ইঞ্জিনের বাইরে থেকে সংস্থানগুলি পরিবর্তন করতে দেয় allows (শিল্পীরা কনসোলগুলিতে কাজ করার সময় এটি প্রয়োজনীয়;))

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

(সংক্ষিপ্ত) উদাহরণ

// very abbreviated!
// this code would never survive our coding guidelines ;)

ResourceManager* pRm = new ResourceManager;
pRm->initialize( );
pRm->registerFactory( new TextureFactory );
// [...]
TextureHandle tex = pRm->getResource<Texture>( "test.otx" ); // in real code we use some macro magic here to use CRCs for filenames
tex->storeToHardware( 0 ); // channel 0

pRm->releaseResource( pRm );

// [...]
pRm->shutdown(); // will log any leaked resource

6

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

স্টিভ ইয়েজ (অনেকের মধ্যে অনেকেই) সিঙ্গেলটন প্যাটার্নের মাধ্যমে কীভাবে অকেজো ব্যবস্থাপক শ্রেণীর ক্লাস সত্তা রয়েছে সে সম্পর্কে একটি ভাল গল্প লিখেছেন। http://sites.google.com/site/steveyegge2/singleton-considered-stupid


2
ঠিক আছে, নিশ্চিত তবে অ্যান্ড্রয়েড (বা অন্যান্য গেমস) এর মতো ক্ষেত্রে গেমটি শুরুর আগে আপনার প্রচুর গ্রাফিক্স / সাউন্ড মেমোরিতে লোড করতে হবে, সময়কালে নয়। লোড স্ক্রিন চলাকালীন আপনি এটি (কারখানাগুলি) যা করতে বলছেন তা কীভাবে ব্যবহার করতে পারি? লোড স্ক্রিনে কারখানার প্রতিটি বস্তুটি কেবল আঘাত করুন যাতে এটি তাদের ক্যাশে করে?
ব্রায়ান ডেনি

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

@ জো "লোডিং স্ক্রিনগুলি" সম্পর্কে আমার অন্যান্য প্রশ্নটি একবার দেখুন: গেমদেব.স্ট্যাকেক্সেঞ্জার / প্রশ্নস / ১১/১/২ খালি ক্যাশে হিট করার অর্থ ডিস্কে যাওয়ার জন্য দীর্ঘ সময় যাবত হতে পারে এবং সেই প্রথম কলগুলিতে কিছু এফপিএস পারফরম্যান্স হিট হতে পারে । আপনি যদি আগেই জানেন যে আপনি সময়ের আগে কী আঘাত করতে চলেছেন, এটি প্রাক-ক্যাশে লোড করার সময় এটিও আঘাত করতে পারে, তাই না?
ব্রায়ান ডেনি

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

1
@ জো, কারখানাও কি "উত্সর্গীকৃত পরিচালক" নয়?
এমএসএন

2

আমি সবসময় ভেবেছিলাম যে একজন ভাল সম্পদ পরিচালককে বিভিন্ন ধরণের অপারেশন করা উচিত। এই মোডগুলি সম্ভবত একটি সাধারণ ইন্টারফেস মেনে পৃথক উত্স মডিউল হতে পারে। অপারেশনের দুটি প্রাথমিক পদ্ধতি হ'ল:

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

আপনার কাছে এমন একটি সরঞ্জাম দরকার যা শেয়ারড ডাটাবেস থেকে সমস্ত মূল্যায়ন দখল করতে পারে এবং উত্পাদন ডেটাসেট তৈরি করতে পারে।

বিকাশকারী হিসাবে আমার বছরগুলিতে, আমি এর আগে কখনও দেখিনি, যদিও আমি কেবলমাত্র কয়েকটি মুষ্টিমেয় সংস্থার জন্য কাজ করেছি যাতে আমার দৃষ্টিভঙ্গি সত্যিই প্রতিনিধি না হয়।

হালনাগাদ

ঠিক আছে, কিছু নেতিবাচক ভোট। আমি এই নকশায় প্রসারিত করব।

প্রথমত, আপনার সত্যিই কারখানার ক্লাসের দরকার নেই কারণ যদি আপনি পান:

TextureHandle tex = pRm->getResource<Texture>( "test.otx" );

আপনি টাইপটি জানেন, তাই কেবল করুন:

TextureHandle tex = new TextureHandle ("test.otx");

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

if (texture already loaded)
  update texture reference count
else
  asset_stream = new AssetStream (resource_id)
  asset_stream->ReadBytes
  create texture
  set texture ref count to 1

অ্যাসেট স্ট্রিম ডেটাটির অবস্থান সন্ধান করতে রিসোর্স_আইডি প্যারামিটার ব্যবহার করে। এটি যেভাবে করেছে এটি নির্ভর করবে আপনি যে পরিবেশে চলেছেন তার উপর:

বিকাশে: স্ট্রিমটি একটি ডাটাবেসে আইডি সন্ধান করে (উদাহরণস্বরূপ এসকিউএল ব্যবহার করে) কোনও ফাইলের নাম পেতে এবং তারপরে ফাইলটি খোলে, স্থানীয়ভাবে ফাইলটি উপস্থিত থাকতে পারে বা একটি সার্ভার থেকে টানতে পারে যদি স্থানীয় ফাইল উপস্থিত না থাকে বা থাকে পুরানো

রিলিজে: স্ট্রিমটি একটি বড়, প্যাকযুক্ত ফাইলের (অফ ডুমের ডাব্লুএডি ফাইলের মতো) একটি অফসেট / আকার পেতে একটি কী / মান সারণীতে আইডিটি সন্ধান করে।


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

@ জো: আমি কেবলমাত্র এসকিউএলকে একটি উদাহরণ হিসাবে দিয়েছি এবং তারপরে কেবল উন্নয়নের পরিবেশে আপনি সমানভাবে একটি ভিসিএস ব্যবহার করতে পারেন। আমি কেবলমাত্র এসকিউএল ডাটাবেসকে প্রস্তাব দিয়েছি যেহেতু আপনি তখন সঞ্চিত বস্তুগুলিতে অতিরিক্ত তথ্য যুক্ত করতে পারেন এবং ডাটাবেস থেকে তথ্য জিজ্ঞাসা করতে এসকিউএল ফাংশনগুলি ব্যবহার করতে পারেন (অন্য কোনও কিছুর চেয়ে আরও বেশি ম্যানেজমেন্ট লাভ)। অকালীন অপ্টিমাইজেশান হিসাবে অস্বচ্ছ আইডি হিসাবে - কেউ কেউ আমার অনুমান অনুসারে এটি দেখতে পারে তবে আমি মনে করি এটি বিকাশের পরবর্তী সময়ে শো-হর্নিংয়ের চেয়ে এটিকে দিয়ে শুরু করা আরও সহজ হবে। আমি মনে করি না আপনি আইডি বা স্ট্রিং ব্যবহার করলে এটি বিকাশের খুব বেশি প্রভাব ফেলবে।
স্কিজ

2

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

আমার পদ্ধতি ওপেন-ওয়ার্ল্ড মানচিত্রের জন্য নিখুঁত, তবে একটি স্তর ভিত্তিক গেমটি এই পদ্ধতিটি আপনাকে নির্বিঘ্নে উপকার করবে না। আশাকরি এটা সাহায্য করবে!

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