কোনও অ্যান্টিটি-কম্পোনেন্ট সিস্টেম ডিকপলিং / তথ্য গোপনের জন্য ভয়ঙ্কর নয়?


11

শিরোনামটি ইচ্ছাকৃতভাবে হাইপারবোলিক এবং এটি কেবল প্যাটার্নটির সাথে আমার অনভিজ্ঞ হতে পারে তবে আমার যুক্তিটি এখানে:

সত্তা বাস্তবায়নের "সাধারণ" বা তর্কযুক্ত যুক্তিযুক্ত সহজ উপায় হ'ল তাদের অবজেক্ট হিসাবে প্রয়োগ করে এবং সাধারণ আচরণ সাবক্লাসিং করে। এটি "এর EvilTreeএকটি সাবক্লাস Treeনাকি Enemy?" এর ক্লাসিক সমস্যার দিকে পরিচালিত করে । আমরা যদি একাধিক উত্তরাধিকারের অনুমতি দিই, তবে হীরকের সমস্যা দেখা দেয়। আমরা পরিবর্তে সম্মিলিত কার্যকারিতা টানতে Treeএবং Enemyআরও upশ্বরের শ্রেণীর দিকে পরিচালিত করে এমন শ্রেণিবিন্যাসকে আরও উপরে তুলে ধরতে পারি, বা আমরা আমাদের TreeEntityশ্রেণিতে ইচ্ছাকৃত আচরণটি ছেড়ে দিতে পারি (চরম ক্ষেত্রে তাদের ইন্টারফেস তৈরি করে) যাতে EvilTreeএটি নিজে প্রয়োগ করতে পারে - যা বাড়ে কোড সদৃশ যদি আমরা কখনও একটি SomewhatEvilTree

সত্তা-অংশীদার সিস্টেমগুলি এই সমস্যাটি সমাধান করতে চেষ্টা করে Treeএবং Enemyবস্তুকে বিভিন্ন উপাদানগুলিতে বিভক্ত করে - বলে Position, Healthএবং AI- এবং প্রয়োগ করে সিস্টেমগুলি যেমন AISystemএআইয়ের সিদ্ধান্ত অনুযায়ী কোনও এন্টিটির অবস্থান পরিবর্তন করে। এখন পর্যন্ত এত ভাল তবে যদি EvilTreeকোনও পাওয়ারআপ বাছাই করতে পারে এবং ক্ষয়ক্ষতি ডিল করতে পারে? প্রথমে আমাদের একটি CollisionSystemএবং একটি প্রয়োজন DamageSystem(সম্ভবত আমাদের ইতিমধ্যে এটি রয়েছে)। CollisionSystemচাহিদার সঙ্গে যোগাযোগ করতে DamageSystem: প্রত্যেক সময় দুটি জিনিস ধাক্কা লাগা CollisionSystemএকটি বার্তা পাঠায় DamageSystemস্বাস্থ্য তাই এটি বিয়োগ করতে পারেন। ক্ষয়টি পাওয়ারআপগুলি দ্বারাও প্রভাবিত হয় তাই আমাদের এটি অন্য কোথাও সংরক্ষণ করা দরকার। PowerupComponentসত্ত্বার সাথে আমরা সংযুক্ত করে কি আমরা একটি নতুন তৈরি করি? কিন্তু তারপরDamageSystemএটি এমন কিছু সম্পর্কে জানার দরকার যা এটি সম্পর্কে কিছুই জানত না - সর্বোপরি এমন কিছু জিনিস রয়েছে যা ক্ষতির মুখোমুখি হয় যা পাওয়ার আপগুলি তুলতে পারে না (যেমন ক Spike)। আমরা কি এই উত্তরটির অনুরূপ ক্ষতির গণনার জন্য ব্যবহৃত PowerupSystemএকটিটি সংশোধন করার অনুমতি দিই ? তবে এখন দুটি সিস্টেম একই ডেটা অ্যাক্সেস করে। আমাদের খেলাটি আরও জটিল হওয়ার সাথে সাথে এটি একটি অদম্য নির্ভরতা গ্রাফ হয়ে উঠবে যেখানে উপাদানগুলি অনেকগুলি সিস্টেমের মধ্যে ভাগ করা হয়। এই মুহুর্তে আমরা কেবল গ্লোবাল স্ট্যাটিক ভেরিয়েবলগুলি ব্যবহার করতে পারি এবং সমস্ত বয়লারপ্লেট থেকে মুক্তি পেতে পারি।StatComponent

এটি সমাধানের কার্যকর উপায় আছে কি? আমার একটি ধারণা ছিল উপাদানগুলিকে কিছু নির্দিষ্ট কাজ করতে দেওয়া, উদাহরণস্বরূপ, StatComponent attack()যা কেবলমাত্র একটি পূর্ণসংখ্যকে ডিফল্টরূপে দেয় তবে পাওয়ারআপ হওয়ার পরে রচনা করা যায়:

attack = getAttack compose powerupBy(20) compose powerdownBy(40)

এটি attackএকাধিক সিস্টেম দ্বারা অ্যাক্সেস করা উপাদানগুলিতে সংরক্ষণ করতে হবে এমন সমস্যাটি সমাধান করে না তবে কমপক্ষে আমি সঠিকভাবে ফাংশনগুলি টাইপ করতে পারতাম যদি আমার কাছে এমন ভাষা থাকে যা একে যথেষ্ট সমর্থন করে:

// In StatComponent
type Strength = PrePowerup | PostPowerup
type Damage = Int
type PrePowerup = Int
type PostPowerup = Int
attack: Strength = getAttack //default value, can be changed by systems
getAttack: PrePowerup

// these functions can be defined in other components or in PowerupSystems
powerupBy: Strength -> PostPowerup
powerdownBy: Strength -> PostPowerup
subtractArmor: Strength -> Damage

// in DamageSystem
dealDamage: Damage -> () = attack compose subtractArmor compose hurtSomeEntity

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

এর আশেপাশে কোন সমাধান আছে কি? ইসিএসকে আরও পরিষ্কারভাবে ডিকুয়াল করতে আমি কোনও কার্যকারিতা / প্যাটার্ন অনুপস্থিত রয়েছি? এফআরপি কি এই সমস্যার জন্য আরও কঠোরভাবে উপযুক্ত? এই সমস্যাগুলি কি কেবল আমি প্রোগ্রাম করার চেষ্টা করছি তার অন্তর্নিহিত জটিলতার কারণে উদ্ভূত হয়েছিল; অর্থাত্ এফআরপিতে কি একই রকম সমস্যা থাকবে?



আমি এরিকের ব্লগটি সত্যিই মিস করছি (যখন এটি সি # এর আগে ছিল)।
ওল্ডফার্ট

উত্তর:


21

ইসিএস পুরোপুরি ডেটা লুকিয়ে রাখে। এটি নিদর্শনটির একটি বাণিজ্য trade

ইসিএস হয় চমৎকার decoupling করেন। একটি ভাল ইসিএস একটি সরানো সিস্টেমটিকে ঘোষণার অনুমতি দেয় যে এটি কোন সত্তার উপর বেগ এবং অবস্থানের উপাদান রয়েছে সে সম্পর্কে কাজ করে না, কোন সত্তার প্রকারগুলি বিদ্যমান, বা অন্যান্য সিস্টেমগুলি এই উপাদানগুলিতে অ্যাক্সেস করে তা বিবেচনা না করেই কাজ করে। গেম অবজেক্টগুলি নির্দিষ্ট ইন্টারফেস প্রয়োগ করার ক্ষমতার ক্ষেত্রে এটি কমপক্ষে সমান।

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

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


7

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

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

এই পদ্ধতিতে আমি কমপক্ষে সিস্টেম দ্বারা যুক্ত বিভিন্ন ফাংশনগুলির সঠিক ক্রমটির গ্যারান্টি দিচ্ছি

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

এফআরপি কি এই সমস্যার জন্য আরও কঠোরভাবে উপযুক্ত? এই সমস্যাগুলি কি কেবল আমি প্রোগ্রাম করার চেষ্টা করছি তার অন্তর্নিহিত জটিলতার কারণে উদ্ভূত হয়েছিল; অর্থাত্ এফআরপিতে কি একই রকম সমস্যা থাকবে?

এই সত্তা-উপাদান-সিস্টেম ডিজাইন এবং এফআরপি ব্যবহার পারস্পরিক একচেটিয়া নয়। প্রকৃতপক্ষে, সিস্টেমগুলিকে কোনও রাজ্য না থাকায় কেবলমাত্র ডেটা ট্রান্সফর্মেশনগুলি (উপাদানগুলি) সম্পাদন করা হিসাবে দেখা যায়।

এফআরপি কিছু অপারেশন করার জন্য আপনার প্রয়োজনীয় তথ্য ব্যবহার করার সমস্যাটি সমাধান করবে না।

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