ভিডিওগেমগুলি কীভাবে অবজেক্ট-ভিত্তিক? [বন্ধ]


18

আমি সবসময় ভেবে দেখেছি কীভাবে অবজেক্ট অরিয়েন্টেশনটি ভিডিওগেমগুলি, বিশেষত বিশাল 3D প্রকল্প দ্বারা ব্যবহৃত হয়। আমি শ্রেণীভুক্ত শীতল উভয় হবে trollএবং werewolfতার বৈশিষ্ট্যাবলী উত্তরাধিকারসূত্রে enemyএবং তাদের কিছু অধিলিখন। তবে ক্লাসগুলি ব্যবহারিক হতে খুব ভারী, আমি জানি না ...


2
কীভাবে একজন অবজেক্ট-ওরিয়েন্টেশনকে (বা এমনকি বস্তুনিষ্ঠভাবে যোগ্য করে তোলার) যোগ্যতা দেয়? আপনি কি মাইয়ার্স বা ডাহল-নায়গার্ডসে উত্তর চান?

স্পষ্টতই তারা এতটাই ভারী যে একটি ভারী ওও ভিত্তিক ভাষা হ'ল শিল্পের মান।
কম্যুনিস্ট হাঁস

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

উত্তর:


20

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

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

সম্প্রসারণ : আপনার উদাহরণে Trollএবং Werewolfপ্রসারিত হবে Enemy, যা প্রসারিত EntityEntityচলাচল, স্বাস্থ্য ইত্যাদির মতো মৌলিক বিষয়গুলি সম্পর্কে যত্ন নেয়, যখন Enemyসাবক্লাসগুলি শত্রু হিসাবে বর্ণনা করে এবং অন্যান্য কাজ করে (মাইনক্রাফ্ট এই পদ্ধতির অনুসরণ করে)।

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

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

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


2
আন্তঃআস্তাদ লাগছে। তবে আমি মিথ্যা বলব না, componentএই প্রসঙ্গে কী তা আমি জানি না । একটি লিঙ্ক অনেক প্রশংসা হবে।
vemv

একটি উপাদান একটি সত্তা যা একক কার্যকারিতার জন্য দায়বদ্ধ। উপাদান-ভিত্তিক সত্তা কোনও উপাদানটির মালিক হবে (যদি এটি হয় তবে) এটি এর উত্তরাধিকারী হবে না। মালিকানাটি বোঝায় যে কোনও সত্তা তার আচরণের পরিবর্তন করে এমন একটি উপাদানকে নিষ্ক্রিয় করতে পারে। ক্লাসিক এক্সটেনশন দৃষ্টান্তে আচরণটি একটি সুপার-ক্লাসের "অন্তর্ভুক্ত" কারণে। সত্তা একটি উপাদান হতে পারে এবং একটি উপাদান একটি শ্রেণি বা স্ট্রাক্ট হিসাবে মডেল করা যায় যদি আপনি চান prefer
FxIII

উপাদান (কখনও কখনও সত্তা সিস্টেম বলা হয়) - আপনি ধারণাগুলির জন্য এই ব্লগটি অনুসন্ধান করতে পারেন t-machine.org বিভিন্ন রূপ রয়েছে তবে প্রাথমিক ধারণাটি হ'ল একটি উপাদান একটি বিশেষ উদ্দেশ্য বস্তু এবং আপনার অভিনেতা একত্রে বিভিন্ন উপাদানকে সংযুক্ত করে যেমন একটি মডেল তৈরি করা like লেগোস থেকে
প্যাট্রিক হিউজেস

2
আমি গেম ডেভেলপমেন্ট সম্পর্কে একটি ব্লগ শুরু করেছি এবং এটি সম্পর্কে আমার প্রথম ব্লগ এন্ট্রি লিখেছি। নতুন কিছু নয় তবে কিছুটা কোড সহ: jagamedev.wordpress.com/2011/06/26/…
মার্কো

23

আমি মনে করি এটি দুর্দান্ত হবে যে ট্রল এবং ওয়েয়ারওয়ल्फ উভয়ই শত্রুর কাছ থেকে এর বৈশিষ্ট্য উত্তরাধিকার সূত্রে পেয়েছে এবং এর মধ্যে কিছুগুলি ওভাররোট করে।

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

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

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

তবে ক্লাসগুলি ব্যবহারিক হতে খুব ভারী, আমি জানি না ...

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


3
এই উত্তরটি
ভালবাসুন

8

আপনি "খুব ভারী" বলতে চাইছেন তা আমি নিশ্চিত নই তবে সি ++ / ওওপি হ'ল গেম বিকাশের লিঙ্গুয়া ফ্র্যাঙ্কা একই ভাল কারণে এটি অন্য কোথাও ব্যবহৃত হয়।

ক্যাশে উড়িয়ে দেওয়ার কথাটি কোনও ভাষার বৈশিষ্ট্য নয়, একটি ডিজাইনের সমস্যা। সি ++ খুব খারাপ হতে পারে না কারণ এটি গত 15-20 বছর ধরে গেমসে ব্যবহৃত হয়। জাভা খুব খারাপ হতে পারে না যেহেতু এটি স্মার্ট ফোনগুলির খুব টান রান সময় পরিবেশে ব্যবহৃত হয়।

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

এটি সমস্ত ওওপি এবং নতুন সফ্টওয়্যার ডিজাইন করার সময় বেসলাইন হিসাবে এখনও ব্যবহৃত হয়, ক্লাসগুলি কীভাবে প্রকাশিত হয় তার উপর ঠিক আলাদা ফোকাস।


2

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


বিভিন্ন পলিমারফিক ধরণের মধ্যে প্রেরণ এমন পদ্ধতিতে করা হয় যা দুর্বল স্মৃতিশক্তি দেয়। এমনকি সি ++ ভিটিবেলস বা অবজেক্টিভ-সি আইএমপি ক্যাচিংয়ের মতো হালকা-ওজন বাস্তবায়নেও যদি আপনি প্রকৃতপক্ষে বিভিন্ন ধরণের জিনিসগুলির সাথে মোকাবিলা করার জন্য বহুবর্ষ ব্যবহার করেন তবে আপনি আপনার ক্যাশে ফুটিয়ে তুলবেন । অবশ্যই আপনি যদি ভিটিবেল আপনার ক্যাশে থাকেন বা আইএমপি ক্যাশেড বার্তাটি সঠিক জায়গায় নিয়ে যায় তার চেয়ে বহুবচন ব্যবহার না করেন তবে কেন বিরক্ত হন? এবং জাভা বা সি # তে ব্যয় আরও ভারী, এবং জাভাস্ক্রিপ্ট বা পাইথনে ব্যয় এখনও ভারী।

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

1

একটি বিষয় সচেতন হতে হবে যে অবজেক্ট-ওরিয়েন্টেড কোডের ধারণাগুলি প্রায়শই ভাষাগুলিতে তাদের প্রয়োগের চেয়ে বেশি মূল্যবান। বিশেষত, একটি প্রধান লুপের সত্ত্বায় সন্ধানের জন্য ভার্চুয়াল আপডেটের অসংখ্য কল করা সি 360+ বা পিএস 3 এর মতো প্ল্যাটফর্মে সি ++ এর ক্যাশে একটি গোলমাল সৃষ্টি করতে পারে - সুতরাং বাস্তবায়নের কারণে "ভার্চুয়াল" বা এমনকি "শ্রেণি" কীওয়ার্ডগুলি এড়ানো যেতে পারে গতি

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

আইওএস / ম্যাকের জন্য অবজেক্টিভ-সি-তে একই রকম, তবে বার্তাপ্রেরণ স্কিমের সাথে আরও খারাপ সমস্যা (এমনকি অভিনব ক্যাশিং স্টাফ সহ) ...


0

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


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