গেমস তৈরি করার সময় আপনি প্রায়শই নিম্নলিখিত গেমের অবজেক্ট তৈরি করেন যা থেকে সমস্ত সত্তা উত্তরাধিকার সূত্রে:
public class GameObject{
abstract void Update(...);
abstract void Draw(...);
}
সুতরাং আপনি লুপ আপডেট করে আপনি সমস্ত গেমের অবজেক্টের উপর পুনরাবৃত্তি করেন এবং তাদের রাষ্ট্র পরিবর্তন করার সুযোগ দেন, তারপরে পরবর্তী অঙ্কনের লুপে আপনি সমস্ত গেমের বস্তুগুলির উপর আবার পুনরাবৃত্তি করেন এবং তাদেরকে নিজের আঁকানোর সুযোগ দেন।
যদিও এটি সরল ফরোয়ার্ড রেন্ডারারের সাথে একটি সাধারণ খেলায় মোটামুটি কার্যকরভাবে কাজ করে এটি প্রায়শই কয়েকটি বিশাল দৈর্ঘ্যের গেম অবজেক্টগুলির দিকে পরিচালিত করে যা তাদের মডেলগুলি সংরক্ষণ করতে হবে, একাধিক টেক্সচার এবং সমস্ত ফ্যাট ড্র পদ্ধতির মধ্যে সবচেয়ে খারাপ যা গেমের অবজেক্টের মধ্যে একটি টান সংযোগ তৈরি করে, বর্তমান রেন্ডার কৌশল এবং যে কোনও রেন্ডারিং সম্পর্কিত ক্লাস।
আমি যদি রেন্ডার কৌশলটি সামনে থেকে স্থগিতের দিকে পরিবর্তন করি তবে আমাকে প্রচুর গেম অবজেক্ট আপডেট করতে হবে। এবং আমি যে গেমের জিনিসগুলি করি তা সেগুলি পুনরায় ব্যবহারযোগ্য হয় না। অবশ্যই উত্তরাধিকার এবং / অথবা রচনা আমাকে কোড ডুপ্লিকেশনকে লড়াই করতে এবং বাস্তবায়ন পরিবর্তন করা আরও সহজ করে তুলতে সহায়তা করতে পারে তবে এটি এখনও অভাব বোধ করে।
সম্ভবত আরও ভাল উপায় হ'ল গেমওজেক্ট ক্লাস থেকে অঙ্কন পদ্ধতি পুরোপুরি সরিয়ে একটি রেন্ডারার ক্লাস তৈরি করা। গেমওজেক্টটিতে এখনও এর ভিজ্যুয়াল সম্পর্কে কিছু তথ্য থাকা দরকার, যেমনটি কোন মডেলটির সাথে প্রতিনিধিত্ব করবে এবং মডেলটিতে কোন টেক্সচার আঁকা উচিত, তবে কীভাবে এটি করা হয় তা রেন্ডারারের কাছে রেখে দেওয়া হবে। তবে রেন্ডারিংয়ের ক্ষেত্রে প্রায়শই সীমান্তের অনেকগুলি মামলা রয়েছে যদিও এটি গেমওজেক্ট থেকে রেন্ডারারের কাছে টাইট-কাপলিং সরিয়ে ফেলবে, রেন্ডারারের এখনও সমস্ত গেমের জিনিসগুলি যা এটি চর্বিযুক্ত করে তোলে সে সম্পর্কে সমস্ত কিছু জানতে হবে, সমস্ত জেনে রাখা এবং শক্তভাবে মিলিত. এটি বেশ কয়েকটি ভাল অভ্যাস লঙ্ঘন করবে। হয়তো ডেটা ওরিয়েন্টেড-ডিজাইন কৌশলটি করতে পারে। গেম অবজেক্টস অবশ্যই ডেটা হবে, তবে কীভাবে রেন্ডারার এটি দ্বারা চালিত হবে? আমি নিশ্চিত নই.
সুতরাং আমি ক্ষতিতে আছি এবং ভাল সমাধানের কথা ভাবতে পারি না। আমি এমভিসির নীতিগুলি ব্যবহার করার চেষ্টা করেছি এবং অতীতে গেমগুলিতে এটি কীভাবে ব্যবহার করা যায় সে সম্পর্কে আমার কিছু ধারণা ছিল তবে সাম্প্রতিক সময়ে এটি যেমনটি ভেবেছিল তেমনটি কার্যকর বলে মনে হয় না। আপনারা সকলেই কীভাবে এই সমস্যাটি মোকাবেলা করবেন তা জানতে আগ্রহী।
যাইহোক, আসুন পুনরুদ্ধার করা যাক, আমি নিম্নলিখিত ডিজাইন লক্ষ্যগুলি কীভাবে অর্জন করতে পারি তাতে আগ্রহী।
- গেম অবজেক্টে কোনও রেন্ডারিং লজিক নেই
- গেম অবজেক্ট এবং রেন্ডার ইঞ্জিনের মধ্যে আলগা মিলন
- সমস্ত জ্ঞান সরবরাহকারী নেই
- রেন্ডার ইঞ্জিনগুলির মধ্যে রানটাইম স্যুইচিং
আদর্শ প্রকল্পের সেটআপটি একটি পৃথক 'গেম লজিক' হবে এবং লজিক প্রজেক্ট রেন্ডার করবে যার একে অপরকে রেফারেন্স দেওয়ার দরকার নেই।
এই চিন্তার ট্রেনটি সমস্ত তখনই শুরু হয়েছিল যখন আমি জন কারম্যাক টুইটারে বলতে শুনেছিলাম যে তার এমন একটি সিস্টেম রয়েছে যাতে তিনি রান সময়ে ইঞ্জিনগুলি রেন্ডার করে নিতে পারেন এবং এমনকি তার সিস্টেমকে উভয় রেন্ডারার (একটি সফ্টওয়্যার রেন্ডারার এবং একটি হার্ডওয়্যার-ত্বরণকারী রেন্ডারার) ব্যবহার করতে বলতে পারেন একই সাথে তিনি পার্থক্যগুলিও পরিদর্শন করতে পারেন। আমি এখন পর্যন্ত যে সিস্টেমগুলি প্রোগ্রাম করেছি তা এমনকি নমনীয়ের কাছাকাছি নয়