আমি মাইক অ্যাক্টনের 3 টি বড় মিথ্যা পড়া শুরু করার পরামর্শ দেব, কারণ আপনি সেগুলির দুটি লঙ্ঘন করেছেন। আমি গুরুতর, আপনার কোডটি ডিজাইনের পদ্ধতিটি এটি পরিবর্তন করবে: http://cellperformance.beyond3d.com/articles/2008/03/three-big-lies.html
তাহলে আপনি কোনটি লঙ্ঘন করবেন?
মিথ্যা # 3 - কোড তথ্যের চেয়ে গুরুত্বপূর্ণ
আপনি নির্ভরতা ইনজেকশন সম্পর্কে কথা বলেন, যা কিছু (এবং কেবল কয়েকটি) উদাহরণে কার্যকর হতে পারে তবে আপনি যদি বিশেষত গেমের বিকাশে এটি ব্যবহার করেন তবে সর্বদা দুর্দান্ত অ্যালার্ম বেল বাজানো উচিত! কেন? কারণ এটি প্রায়শই অপ্রয়োজনীয় বিমূর্ততা। এবং ভুল জায়গায় বিমূর্ততা ভয়ঙ্কর। সুতরাং আপনি একটি খেলা আছে। গেমটিতে বিভিন্ন উপাদানগুলির জন্য পরিচালক রয়েছে। উপাদানগুলি সমস্ত সংজ্ঞায়িত করা হয়। সুতরাং আপনার প্রধান গেমের লুপ কোডের কোথাও একটি ক্লাস তৈরি করুন যা পরিচালকদের "রয়েছে"। ভালো লেগেছে:
private CollissionManager _collissionManager;
private BulletManager _bulletManager;
প্রতিটি পরিচালকের ক্লাস (getBulletManager ()) পেতে এটি কিছু গিটার ফাংশন দিন Give সম্ভবত এই শ্রেণিটি নিজেই একটি সিঙ্গলটন বা এটি একটির কাছ থেকে পৌঁছানো যায় (যে কোনও উপায়ে আপনি সম্ভবত একটি কেন্দ্রীয় গেমাল সিঙ্গলটন পেয়েছেন)। ভালভাবে সংজ্ঞায়িত হার্ড-কোডড ডেটা এবং আচরণে কোনও সমস্যা নেই।
এমন কোনও ম্যানেজারম্যানেজার তৈরি করবেন না যা আপনাকে কীগুলি ব্যবহার করে পরিচালকদের নিবন্ধভুক্ত করতে দেয়, যা পরিচালক ব্যবহার করতে চান এমন অন্যান্য শ্রেণীর দ্বারা কীটি ব্যবহার করে পুনরুদ্ধার করা যায়। এটি একটি দুর্দান্ত সিস্টেম এবং খুব নমনীয়, তবে এখানে একটি গেম সম্পর্কে কথা বলার জায়গা। আপনি জানেন যে গেমগুলিতে কোন সিস্টেমগুলি রয়েছে। তোমার মতো ভান করে কেন? কারণ এটি এমন লোকদের জন্য একটি সিস্টেম যা মনে করে যে কোডটি ডেটার চেয়ে গুরুত্বপূর্ণ। তারা বলবে "কোডটি নমনীয়, ডেটা কেবল এটি পূরণ করে"। তবে কোডটি কেবলমাত্র ডেটা। আমি বর্ণিত সিস্টেমটি অনেক সহজ, আরও নির্ভরযোগ্য, বজায় রাখা সহজ এবং আরও অনেক নমনীয় (উদাহরণস্বরূপ, যদি একজন পরিচালকের আচরণ অন্য পরিচালকদের থেকে পৃথক হয় তবে আপনাকে কেবল পুরো সিস্টেমটি পুনরায় কাজ করার পরিবর্তে কয়েকটি লাইন পরিবর্তন করতে হবে)
মিথ্যা # 2 - কোডটি বিশ্বের কোনও মডেলকে ঘিরে তৈরি করা উচিত
সুতরাং গেমের জগতে আপনার একটি সত্ত্বা রয়েছে। সত্তাটির আচরণ নির্ধারণ করে এমন অনেকগুলি উপাদান রয়েছে। সুতরাং আপনি উপাদান উপাদানগুলির একটি তালিকা এবং একটি আপডেট () ফাংশন যা প্রতিটি উপাদানগুলির আপডেট () ফাংশন বলে with রাইট?
নাপ :) এটি বিশ্বের একটি মডেলকে ঘিরে নকশা করছে: আপনার খেলায় বুলেট রয়েছে, তাই আপনি একটি বুলেট শ্রেণি যুক্ত করেন। তারপরে আপনি প্রতিটি বুলেট আপডেট করেন এবং পরেরটিতে যান। এটি সম্পূর্ণরূপে আপনার কর্মক্ষমতা হারাবে এবং এটি আপনাকে সর্বত্র ডুপ্লিকেট কোড সহ একটি ভয়ঙ্কর সংশ্লেষযুক্ত কোডবেস দেয় এবং অনুরূপ কোডের কোনও যৌক্তিক কাঠামো দেয় না। ( Traditionalতিহ্যবাহী ওও ডিজাইন কেন সফল হয় তার আরও বিশদ ব্যাখ্যার জন্য আমার উত্তর এখানে দেখুন বা ডেটা ওরিয়েন্টেড ডিজাইন সন্ধান করুন)
আমাদের ওও পক্ষপাতিত্ব ছাড়াই পরিস্থিতিটি একবার দেখুন। আমরা নিম্নলিখিতগুলি চাই, আর কম চাই না (সত্তা বা বস্তুর জন্য কোনও শ্রেণি তৈরি করার প্রয়োজন নেই দয়া করে মনে রাখবেন):
- আপনার একগুচ্ছ সত্ত্বা রয়েছে
- সত্তা বেশ কয়েকটি উপাদান নিয়ে গঠিত যা সত্তার আচরণকে সংজ্ঞায়িত করে
- আপনি প্রতিটি ফ্রেমে গেমের প্রতিটি উপাদান আপডেট করতে চান, পছন্দসই নিয়ন্ত্রিত উপায়ে
- একত্রে অন্তর্গত হিসাবে উপাদানগুলি সনাক্তকরণ ব্যতীত, সত্তাটি নিজেই করার দরকার নেই। এটি বেশ কয়েকটি উপাদানগুলির জন্য একটি লিঙ্ক / আইডি।
এবং পরিস্থিতি তাকান। তোমার কম্পোনেন্ট সিস্টেমের আচরণ আপডেট হবে যে খেলা বস্তুর প্রতি ফ্রেম। এটি অবশ্যই আপনার ইঞ্জিনের একটি জটিল সিস্টেম। পারফরম্যান্স এখানে গুরুত্বপূর্ণ!
যদি আপনি কম্পিউটার আর্কিটেকচার বা ডেটা ওরিয়েন্টেড ডিজাইনের সাথে পরিচিত হন, তবে আপনি কীভাবে সেরা পারফরম্যান্স অর্জন করবেন তা জানেন: শক্তভাবে প্যাকড মেমরি এবং কোড প্রয়োগের গোষ্ঠীভুক্ত করে। আপনি যদি এ, বি এবং সি কোডগুলির স্নিপেটগুলি এভাবে চালান: এবিসিএবিসিএবিসি, আপনি যখন এটির সম্পাদন করেন তখনকার মতো পারফরম্যান্স পাবেন না: এএএবিবিবিসিসিসি। এটি কেবল কারণ নির্দেশনা এবং ডেটা ক্যাশে আরও দক্ষতার সাথে ব্যবহৃত হবে তা নয়, কারণ আপনি যদি একে অপরের পরে সমস্ত "A" গুলি চালান, তবে অপ্টিমাইজেশনের জন্য অনেকগুলি জায়গা রয়েছে: নকল কোড সরিয়ে, প্রাকৃতিকভাবে ডেটা ব্যবহার করা হয় যা ব্যবহার করে সমস্ত "এ" গুলি, ইত্যাদি
সুতরাং আমরা যদি সমস্ত উপাদান আপডেট করতে চাই, আসুন তাদের আপডেট ফাংশন সহ শ্রেণি / অবজেক্টগুলি তৈরি করি না। আসুন প্রতিটি সত্তার প্রতিটি উপাদানগুলির জন্য সেই আপডেট ফাংশনটিকে কল না করি। এটিই "এবিসিএবিসিএবিসি" সমাধান। আসুন সমস্ত অভিন্ন উপাদান আপডেট একসাথে গ্রুপ করি। তারপরে আমরা বি এর পরে সমস্ত এ-উপাদানগুলি আপডেট করতে পারি etc. এগুলি তৈরি করার জন্য আমাদের কী দরকার?
প্রথমত, আমাদের কম্পোনেন্ট ম্যানেজার দরকার। গেমের প্রতিটি ধরণের উপাদানগুলির জন্য আমাদের একটি ম্যানেজার ক্লাস দরকার। এটিতে একটি আপডেট ফাংশন রয়েছে যা এই ধরণের সমস্ত উপাদান আপডেট করবে। এটিতে একটি ক্রিয়া ফাংশন রয়েছে যা সেই ধরণের একটি নতুন উপাদান এবং একটি সরান ফাংশন যুক্ত করবে যা নির্দিষ্ট উপাদানটিকে ধ্বংস করবে। সেই উপাদানটির জন্য নির্দিষ্ট ডেটা পেতে এবং সেট করতে অন্যান্য সহায়ক ফাংশন থাকতে পারে (যেমন: মডেল উপাদানগুলির জন্য 3 ডি মডেল সেট করুন)। নোট করুন যে ম্যানেজারটি কোনও উপায়ে বাইরের বিশ্বের কাছে একটি ব্ল্যাক বক্স রয়েছে। আমরা জানি না যে প্রতিটি উপাদানগুলির ডেটা কীভাবে সংরক্ষণ করা হয়। আমরা জানি না যে প্রতিটি উপাদান কীভাবে আপডেট হয়। যতক্ষণ না উপাদানগুলি তাদের উচিত আচরণ করবে ততক্ষণ আমাদের যত্ন নেই।
পরবর্তী আমাদের একটি সত্তা প্রয়োজন। আপনি এটিকে একটি শ্রেণি তৈরি করতে পারেন, তবে এটি খুব কমই প্রয়োজনীয়। কোনও সত্তা কোনও অনন্য পূর্ণসংখ্যা আইডি বা হ্যাশ স্ট্রিং (সুতরাং একটি পূর্ণসংখ্যা) ছাড়া আর কিছুই হতে পারে। আপনি যখন সত্তার জন্য কোনও উপাদান তৈরি করেন, আপনি পরিচালককে যুক্তি হিসাবে আইডিটি পাস করেন। আপনি যখন উপাদানটি সরাতে চান, আপনি আবার আইডিটি পাস করুন। সত্তাকে কেবল একটি আইডি তৈরির পরিবর্তে কিছুটা বেশি ডেটা যুক্ত করার কিছু সুবিধা থাকতে পারে তবে সেগুলি কেবল সহায়ক ফাংশন হবে কারণ আমি প্রয়োজনীয়গুলির তালিকাবদ্ধ করেছি, সমস্ত সত্তার আচরণগুলি উপাদানগুলি তাদের দ্বারা সংজ্ঞায়িত করা হয়েছে। এটি যদিও আপনার ইঞ্জিন, তাই আপনার পক্ষে যা বোঝায় তা করুন।
আমাদের যা দরকার তা হ'ল একটি সত্তা পরিচালক। আপনি যদি কেবলমাত্র আইডি-সলিউশন ব্যবহার করেন তবে এই শ্রেণিটি অনন্য আইডি উত্পন্ন করবে বা এটি সত্তা অবজেক্ট তৈরি / পরিচালনা করতে ব্যবহার করা যেতে পারে। আপনার যদি প্রয়োজন হয় তবে এটি গেমের সমস্ত সত্ত্বার একটি তালিকা রাখতে পারে। সত্তা পরিচালক আপনার গেমের সমস্ত কম্পোনেন্টম্যানেজারের রেফারেন্সগুলি সঞ্চয় করে এবং তাদের আপডেট ফাংশনটিকে সঠিক ক্রমে কল করে আপনার উপাদান সিস্টেমের কেন্দ্রীয় শ্রেণি হতে পারে। এইভাবে সমস্ত গেম লুপটি করতে হয় হ'ল কলটি হ'ল এনটিটিম্যানেজ.আরআপডেট () এবং পুরো সিস্টেমটি আপনার ইঞ্জিনের বাকি অংশ থেকে খুব সুন্দরভাবে পৃথক।
এটি পাখির চোখের দর্শন, এর উপাদান পরিচালকরা কীভাবে কাজ করে তা একবার দেখে নেওয়া যাক। আপনার যা প্রয়োজন তা এখানে:
- তৈরি করতে (অ্যান্টিআইডিডি) ডাকা হলে উপাদান ডেটা তৈরি করুন
- অপসারণ (অ্যান্টিআইডি) বলা হওয়ার পরে উপাদান ডেটা মুছুন
- আপডেট () কল করার সময় সমস্ত (প্রযোজ্য) উপাদান ডেটা আপডেট করুন (যেমন সমস্ত উপাদান প্রতিটি ফ্রেম আপডেট করার প্রয়োজন হয় না)
সর্বশেষটি যেখানে আপনি উপাদানগুলির আচরণ / যুক্তি সংজ্ঞায়িত করেন এবং আপনি যে উপাদানটি লিখছেন তার উপর সম্পূর্ণ নির্ভর করে। অ্যানিমেশনকম্পোনেন্টটি ফ্রেমটিতে রয়েছে তার উপর ভিত্তি করে অ্যানিমেশন ডেটা আপডেট করবে। ড্রাগেবল কম্পোনেন্টটি কেবলমাত্র একটি উপাদান আপডেট করবে যা মাউস দ্বারা টেনে আনা হচ্ছে। পদার্থবিজ্ঞান বিভাগ ফিজিক্স সিস্টেমে ডেটা আপডেট করবে। তবুও, আপনি একই ধরণের সমস্ত উপাদান একসাথে আপডেট করার কারণে, আপনি কিছু অপ্টিমাইজেশন করতে পারেন যা যখন সম্ভব হয় না যখন প্রতিটি উপাদান কোনও আপডেট ফাংশনযুক্ত একটি পৃথক অবজেক্ট যা যে কোনও সময় বলা যেতে পারে।
নোট করুন যে আমি এখনও উপাদানগুলির ডেটা ধরে রাখতে কোনও এক্সএক্সএক্সএকটি কম্পোনেন্ট শ্রেণি তৈরির জন্য কখনও ডাকিনি। এটা তোমার উপর. আপনি কি ডেটা ওরিয়েন্টেড ডিজাইন পছন্দ করেন? তারপরে প্রতিটি ভেরিয়েবলের জন্য পৃথক অ্যারেতে ডেটা কাঠামো করুন। আপনি কি অবজেক্ট অরিয়েন্টেড ডিজাইন পছন্দ করেন? (আমি এটি সুপারিশ করব না, এটি এখনও অনেক স্থানে আপনার পারফরম্যান্সকে হত্যা করবে) তারপরে একটি এক্সএক্সএক্সকোম্পোন উপাদানটি তৈরি করুন যা প্রতিটি উপাদানগুলির ডেটা ধারণ করবে।
পরিচালকদের সম্পর্কে দুর্দান্ত জিনিস হ'ল এনক্যাপসুলেশন। প্রোগ্রামিংয়ের বিশ্বে এখন এনক্যাপসুলেশন হ'ল সবচেয়ে ভয়াবহভাবে অপব্যবহার করা দর্শন। এটি এইভাবে ব্যবহার করা উচিত। কোন ব্যবস্থার যুক্তি কীভাবে কাজ করে কোথায় কোন উপাদান ডেটা সংরক্ষণ করা হয় তা কেবল পরিচালকই জানেন। ডেটা পেতে / সেট করার জন্য কয়েকটি ফাংশন রয়েছে তবে এটি। আপনি পুরো ম্যানেজার এবং এর অন্তর্নিহিত ক্লাসগুলি আবার লিখতে পারেন এবং যদি আপনি পাবলিক ইন্টারফেস পরিবর্তন না করেন তবে কেউই বিজ্ঞপ্তি দেয় না। পদার্থবিজ্ঞানের ইঞ্জিন বদলেছে? কেবল পদার্থবিজ্ঞান কম্পোনেন্ট ম্যানেজার পুনর্লিখন করুন এবং আপনার কাজ শেষ।
তারপরে একটি চূড়ান্ত জিনিস রয়েছে: উপাদানগুলির মধ্যে যোগাযোগ এবং ডেটা ভাগ করা। এখন এটি জটিল এবং কোনও আকারের-ফিট-সব সমাধান নেই। উদাহরণস্বরূপ সংঘর্ষের উপাদানটি পজিশন উপাদান (যেমন পজিশন ম্যানেজার.জেটপজিশন (অ্যান্টিআইডি)) থেকে অবস্থান পাওয়ার জন্য আপনি ম্যানেজারগুলিতে গেট / সেট ফাংশন তৈরি করতে পারেন। আপনি একটি ইভেন্ট সিস্টেম ব্যবহার করতে পারেন। আপনি সত্তায় কিছু ভাগ করা ডেটা সঞ্চয় করতে পারেন (আমার মতে কুরুচিপূর্ণ সমাধান)। আপনি একটি বার্তা ব্যবস্থা (এটি প্রায়শই ব্যবহৃত হয়) ব্যবহার করতে পারেন। বা একাধিক সিস্টেমের সমন্বয় ব্যবহার করুন! এই সিস্টেমে প্রতিটিতে যাওয়ার জন্য আমার কাছে সময় বা অভিজ্ঞতা নেই তবে গুগল এবং স্ট্যাকওভারফ্লো অনুসন্ধানটি আপনার বন্ধু।