কোনও উপাদান-সত্তা-সিস্টেম আর্কিটেকচার ব্যবহার করে অ্যাপ্লিকেশনগুলি (গেমস নয়) তৈরি করা কি যুক্তিসঙ্গত?


24

আমি জানি যে অ্যাপল অ্যাপস্টোর বা গুগল প্লে অ্যাপ স্টোরের মতো অ্যাপ্লিকেশনগুলি (দেশীয় বা ওয়েব) তৈরি করার সময় মডেল-ভিউ-কন্ট্রোলার আর্কিটেকচারটি ব্যবহার করা খুব সাধারণ।

তবে গেম ইঞ্জিনগুলিতে সাধারণ উপাদান / সত্ত্বা-সিস্টেম আর্কিটেকচার ব্যবহার করে অ্যাপ্লিকেশন তৈরি করা কি যুক্তিসঙ্গত?


1
লাইট টেবিলের আর্কিটেকচারটি দেখুন: chris-granger.com/2013/01/24/the-ide-as-data
হাকান ডেরিয়াল

উত্তর:


39

তবে গেম ইঞ্জিনগুলিতে সাধারণ উপাদান / সত্ত্বা-সিস্টেম আর্কিটেকচার ব্যবহার করে অ্যাপ্লিকেশন তৈরি করা কি যুক্তিসঙ্গত?

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

ভিএফএক্স খেলাগুলির তুলনায় একই রকম যে এখানে একটি "দৃশ্যের" একটি কেন্দ্রীয় ধারণা রয়েছে, যেখানে ভিউপোর্টগুলি রেন্ডার্ড ফলাফলগুলি প্রদর্শন করে। অ্যানিমেশন প্রসঙ্গে নিয়মিতভাবে এই দৃশ্যের চারদিকে ঘুরতে চলেছে অনেক কেন্দ্রীয় লুপী প্রক্রিয়াজাতকরণ, যেখানে পদার্থবিজ্ঞান ঘটতে পারে, কণা নির্গমনকারী স্পণ কণা, অ্যানিমেটেড এবং রেন্ডার হচ্ছে, গতি অ্যানিমেশন ইত্যাদি, এবং শেষ পর্যন্ত তাদের রেন্ডার করতে পারে tend সব শেষে ব্যবহারকারীকে।

কমপক্ষে খুব জটিল গেম ইঞ্জিনগুলির সাথে অন্য একই ধারণাটি ছিল একটি "ডিজাইনার" দিকের প্রয়োজন যেখানে ডিজাইনাররা তাদের নিজস্ব কিছু হালকা প্রোগ্রামিং (স্ক্রিপ্ট এবং নোড) সহ দক্ষতা সহ দৃশ্যের নকশা করতে পারেন scenes

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

.তিহ্যবাহী ওওপি

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

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

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

এখানে চিত্র বর্ণনা লিখুন

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

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

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

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

1980 এর ব্রুট ফোর্স আর্কিটেকচার

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

এখানে চিত্র বর্ণনা লিখুন

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

void transform(struct Object* obj, const float mat[16])
{
    switch (obj->type)
    {
        case camera:
            // cast to camera and do something with camera fields
            break;
        case light:
            // cast to light and do something with light fields
            break;
        ...
    }
}

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

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

কিছু উপকার:

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

কিছু কনস:

  • দুঃস্বপ্ন রক্ষণাবেক্ষণ। আমাদের বিপণন দলটি একটি 3 বছরের চক্রে আমরা 2000 টিরও বেশি অনন্য বাগগুলি স্থির করে দেওয়ার গর্ব করার প্রয়োজনটি অনুভব করে। আমার কাছে এটি বিব্রত হওয়ার মতো যে প্রথমটিতে আমাদের অনেকগুলি বাগ ছিল এবং সেই প্রক্রিয়াটি সম্ভবত এখনও সমস্ত বাগের প্রায় 10% স্থির হয়েছিল যা সংখ্যায় সর্বদা বেড়েই চলেছিল।
  • সবচেয়ে জটিল জটিল সমাধান সম্পর্কে।

1990 এর সিওএম আর্কিটেকচার

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

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

এখানে চিত্র বর্ণনা লিখুন

এই ধরণের পদ্ধতির সাথে, transformউপরের অ্যানালগিকাল ক্রিয়াকলাপটি এই ফর্মের সাথে সাদৃশ্য করতে আসে:

void transform(Object obj, const Matrix& mat)
{
    // Wrapper that performs an interface query to see if the 
    // object implements the IMotion interface.
    MotionRef motion(obj);

    // If the object supported the IMotion interface:
    if (motion.valid())
    {
        // Transform the item through the IMotion interface.
        motion->transform(mat);
        ...
    }
}

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

কিছু উপকার:

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

কিছু কনস:

  • প্রচুর বয়লারপ্লেট। আমাদের উপাদানগুলিকে ইনস্ট্যান্ট করার জন্য একটি রেজিস্ট্রি দিয়ে প্রকাশ করতে হয়েছিল, তারা যে ইন্টারফেসগুলিকে সমর্থন করেছিল তাদের উভয়ই জাভাতে উত্তরাধিকার সূত্রে প্রাপ্ত ("প্রয়োগ") ইন্টারফেস এবং কোয়েরিতে কোন ইন্টারফেস উপলব্ধ ছিল তা চিহ্নিত করার জন্য কিছু কোড সরবরাহ করা প্রয়োজন।
  • খাঁটি ইন্টারফেসের ফলস্বরূপ সমস্ত জায়গায় ডুপ্লিকেট যুক্তি যুক্ত। উদাহরণস্বরূপ, প্রয়োগ করা সমস্ত উপাদানগুলির IMotionসর্বদা কার্যকারিতাগুলির জন্য একই রাজ্য এবং ঠিক একই বাস্তবায়ন থাকবে। এটিকে হ্রাস করতে, আমরা পুরো ইন্টারফেসের জন্য একইভাবে একইভাবে বাস্তবায়িত হওয়ার ঝুঁকির সাথে এবং সম্ভবত একাধিক উত্তরাধিকার সূত্রে পিছনে চলতে থাকবে এমন ব্যবস্থাগুলির জন্য সিস্টেমের ভিত্তিতে বেস ক্লাস এবং সহায়তা কার্যকারিতা শুরু করব but ক্লায়েন্ট কোডটি সহজ থাকলেও হুডের নিচে অগোছালো।
  • অদক্ষতা: ভিটিউন সেশনগুলি প্রায়শই প্রায়শই মাঝারি থেকে উচ্চের QueryInterfaceহটস্পট হিসাবে মাঝেমধ্যে প্রদর্শিত হয় এবং মাঝে মাঝে এমনকি # 1 হটস্পটও দেখায় । এটিকে হ্রাস করতে, আমরা এমন কিছু করতে চাই যেমন কোডবেস ক্যাশে কিছু অংশ রেন্ডারিং রয়েছে যা ইতিমধ্যে সমর্থনের জন্য পরিচিত বস্তুর একটি তালিকা রয়েছেIRenderable, কিন্তু এটি জটিলতা এবং রক্ষণাবেক্ষণ ব্যয় উল্লেখযোগ্যভাবে বাড়িয়ে তুলেছিল। তেমনি, এটি পরিমাপ করা আরও কঠিন ছিল তবে আমরা যখন প্রতিটি একক ইন্টারফেসের গতিশীল প্রেরণের প্রয়োজন হয় তখন সি-স্টাইলের কোডিংয়ের তুলনায় আমরা কিছু নির্দিষ্ট ধীরগতি লক্ষ্য করেছি। শাখার ভুল অনুমান এবং অপ্টিমাইজেশন বাধাগুলির মতো বিষয়গুলি কোডের সামান্য দিকের বাইরে পরিমাপ করা কঠিন, তবে ব্যবহারকারীরা সাধারণত ব্যবহারকারী ইন্টারফেসের প্রতিক্রিয়াশীলতা এবং সফ্টওয়্যারটির পূর্ববর্তী এবং নতুন সংস্করণগুলির সাথে তুলনা করে খারাপ হওয়ার মতো বিষয়গুলি লক্ষ্য করছিলেন side এলগোরিদমিক জটিলতা পরিবর্তিত হয়নি এমন অঞ্চলগুলির পক্ষে, কেবল ধ্রুবকগুলি।
  • বিস্তৃত সিস্টেম স্তরে যথার্থতার বিষয়ে যুক্তি জানানো এখনও কঠিন ছিল। যদিও এটি পূর্বের পদ্ধতির তুলনায় উল্লেখযোগ্যভাবে সহজ ছিল, তবুও এটি পুরো সিস্টেমের মধ্যে অবজেক্টগুলির মধ্যে জটিল মিথস্ক্রিয়াটি বোঝা শক্ত ছিল, বিশেষত কিছু অপ্টিমাইজেশনের সাথে যা এর বিরুদ্ধে প্রয়োজনীয় হতে শুরু করেছিল।
  • আমাদের ইন্টারফেসগুলি সঠিক পেতে আমাদের সমস্যা হয়েছিল। যদিও ইন্টারফেস ব্যবহার করে সিস্টেমে কেবলমাত্র একটি বিস্তৃত জায়গা থাকতে পারে, ব্যবহারকারীর শেষের প্রয়োজনীয়তাগুলি সংস্করণগুলির পরিবর্তে পরিবর্তিত হতে পারে এবং আমরা নতুন শ্রেণীর সাথে যুক্ত হওয়া ইন্টারফেস প্রয়োগকারী সমস্ত শ্রেণিতে ক্যাসকেডিং পরিবর্তন করতে হবে having ইন্টারফেস, উদাহরণস্বরূপ, যদি না এমন কিছু বিমূর্ত বেস শ্রেণি ছিল যা ইতিমধ্যে হুডের নীচে যুক্তিটিকে কেন্দ্রিক করে তুলছিল (এর মধ্যে কিছুগুলি বারবার এটি বারবার না করার আশায় এই তীব্র পরিবর্তনগুলির মাঝামাঝি সময়ে প্রকাশিত হবে)।

এখানে চিত্র বর্ণনা লিখুন

ব্যবহারিক প্রতিক্রিয়া: রচনা

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

সুতরাং এই জাতীয় ক্ষেত্রে, আমাদের ইন্টারফেসের ইন্টারফেসটি ব্যবহার করে সিস্টেমগুলির মধ্যে 3-থেকে -1 সম্পর্ক থাকতে পারে এবং ইন্টারফেসটিতে ইন্টারফেস প্রয়োগকারী সাব-টাইপের মধ্যে 100-থেকে -1 সম্পর্ক থাকতে পারে।

জটিলতা এবং রক্ষণাবেক্ষণের উপর নির্ভর করে 3 ক্লায়েন্ট সিস্টেমের পরিবর্তে 100 টি সাব টাইপগুলি বাস্তবায়ন এবং রক্ষণাবেক্ষণের জন্য মারাত্মকভাবে আঁকানো হবে IMotion। এটি আমাদের রক্ষণাবেক্ষণের সমস্ত অসুবিধা ইন্টারফেস ব্যবহার করে 3 স্থান নয়, এই 100 টি সাব টাইপের রক্ষণাবেক্ষণে স্থানান্তরিত করে। "অপ্রত্যক্ষভাবে অভিজাত কাপলিং" বা কোডের সাথে 3 টি কোড আপডেট করা (এটির উপর নির্ভরশীলতা হিসাবে কিন্তু পরোক্ষভাবে একটি ইন্টারফেসের মাধ্যমে, সরাসরি নির্ভরতা নয়), কোনও বড় কথা নয়: "অপ্রত্যক্ষ অভিজাত কাপলিং" এর নৌকা বোঝা সহ 100 টি সাব টাইপ স্থান আপডেট করা , বেশ বড় ব্যাপার *।

* আমি বুঝতে পারি যে বাস্তবায়নের দৃষ্টিকোণ থেকে "অভিজাত কাপলিংস" এর সংজ্ঞাটি দিয়ে স্ক্রিং করা ভুল এবং ভুল, আমি কেবলমাত্র ইন্টারফেস এবং একশো সাব-টাইপের সাথে সম্পর্কিত বাস্তবায়ন উভয়ই সম্পর্কিত রক্ষণাবেক্ষণ জটিলতার বর্ণনা করার মতো ভাল উপায় খুঁজে পাইনি। অবশ্যই পরিবর্তন করা উচিত।

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

ইন্টারফেসগুলি এইভাবে Behaviorsকোনও সত্তার সাথে যুক্ত বিস্তৃত আকারের হয়ে ওঠে । IMotionকেবল একটি Motion"উপাদান" হয়ে উঠবে (আমি COM থেকে দূরে যেখানে "উপাদান" সংজ্ঞায়নের পদ্ধতিটি পরিবর্তিত করেছিলাম যেখানে সাধারণ সংজ্ঞাটির কাছাকাছি, একটি "সম্পূর্ণ" সত্তা তৈরির অংশ))

এর পরিবর্তে:

class IMotion
{
public:
    virtual ~IMotion() {}
    virtual void transform(const Matrix& mat) = 0;
    ...
};

আমরা এটিকে আরও কিছু এমনভাবে বিকশিত করেছি:

class Motion
{
public:
    void transform(const Matrix& mat)
    {
        ...
    }
    ...

private:
    Matrix transformation;
    ...
};

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

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

এখানে চিত্র বর্ণনা লিখুন

কিছু উপকার:

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

কিছু কনস:

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

একটি ঘটনা ঘটেছিল তা হ'ল যেহেতু আমরা এই আচরণগত উপাদানগুলির বিমূর্ততা হারিয়ে ফেলেছি, সেগুলির মধ্যে আমাদের আরও ছিল more উদাহরণস্বরূপ, একটি বিমূর্ত IRenderableউপাদানটির পরিবর্তে , আমরা একটি কংক্রিট Meshবা PointSpritesউপাদান সহ একটি বস্তু সংযুক্ত করব । রেন্ডারিং সিস্টেমটি কীভাবে রেন্ডার Meshএবং PointSpritesউপাদানগুলি সরবরাহ করতে হয় তা জানত এবং সত্তা সন্ধান করতে পারে যা এই জাতীয় উপাদান সরবরাহ করে এবং সেগুলি আঁকবে। অন্যান্য সময়ে, আমাদের বিবিধ রেন্ডারিবল ছিল SceneLabelযা আমরা আবিষ্কার করেছি যে আমাদের প্রতিবন্ধকতার প্রয়োজন হয়েছিল এবং তাই আমরা SceneLabelসেই ক্ষেত্রে প্রাসঙ্গিক সত্তার সাথে সংযুক্ত করতাম (সম্ভবত এ ছাড়াও Mesh)। রেন্ডারিং সিস্টেমটি বাস্তবায়িত হবে তারপরে সেগুলি সরবরাহকারী সত্তাগুলি কীভাবে রেন্ডার করতে হয় তা জানার জন্য আপডেট করা হবে এবং এটি করা খুব সহজ পরিবর্তন ছিল।

এই ক্ষেত্রে, উপাদানগুলির সমন্বয়ে গঠিত একটি সত্তা তখন অন্য সত্তার উপাদান হিসাবে ব্যবহার করা যেতে পারে। আমরা লেগো ব্লকগুলি হুক করে সেইভাবে জিনিসগুলি তৈরি করব।

ইসিএস: সিস্টেম এবং কাঁচা ডেটা উপাদান

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

আমি যা হারিয়েছিলাম সেগুলি হ'ল কয়েকটি মূল ধারণা:

  1. "উপাদানগুলি" প্রক্রিয়া করার জন্য "সিস্টেমগুলি" এর আনুষ্ঠানিককরণ।
  2. "উপাদান" হ'ল কাঁচা ডেটা হ'ল আচরণগত বস্তুগুলির চেয়ে একত্রে একটি বড় অবজেক্টে রচিত।
  3. উপাদান সংগ্রহের সাথে সম্পর্কিত কোনও কঠোর আইডি ছাড়া আর কিছুই নয়।

অবশেষে আমি সেই সংস্থাটি ছেড়ে ইডিএস হিসাবে একটি ইসিএসে কাজ শুরু করেছিলাম (এখনও আমার সঞ্চয় সাশ্রয় করার সময় এটিতে কাজ করা), এবং এটি এখন পর্যন্ত পরিচালনা করা সবচেয়ে সহজ সিস্টেম ছিল।

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

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

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

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

কিছু উপকার:

  • অপ্রত্যাশিত প্রয়োজনের মুখোমুখি হওয়ার সময় ডিজাইন কোণে আটকা পড়ার অনুভূতি ছাড়াই আমি আমার ক্যারিয়ারে প্রায় প্রতিটি বড় স্থাপত্য সমস্যার মুখোমুখি হলাম।

কিছু কনস:

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

এখানে চিত্র বর্ণনা লিখুন

তবে গেম ইঞ্জিনগুলিতে সাধারণ উপাদান / সত্ত্বা-সিস্টেম আর্কিটেকচার ব্যবহার করে অ্যাপ্লিকেশন তৈরি করা কি যুক্তিসঙ্গত?

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

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

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

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

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

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


1) আপনার উদাহরণ ভিএফএক্স প্রোগ্রামটি কোনও ব্যবহারকারীর দৃষ্টিকোণ থেকে কী করেছে? 2) আপনি এখন কোন ইসিএস প্রকল্পে কাজ করছেন? Writing এটি লেখার জন্য আপনাকে ধন্যবাদ! ♥
পুতুল

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

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

16

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

টিএল; ডিআর - ডিজাইন নিদর্শনগুলি কেবল তখনই কার্যকরভাবে কার্যকর হয় যখন সমস্যা ডোমেন তারা নকশায় আরোপিত বৈশিষ্ট্যগুলি এবং ত্রুটিগুলির জন্য যথেষ্ট উপযুক্ত হয়।


8

যদি সমস্যা ডোমেন এটির সাথে উপযুক্ত হয় তবে অবশ্যই।

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

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

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

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

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

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


1
আপনাকে অনুমতি দেওয়া হয়েছে তা ধরে নিলে, আপনি কি আপনার বর্তমান কাজের আরও বিশদ সরবরাহ করতে পারবেন? আপনি কী তৈরি করছেন তার জন্য সিইএস কীভাবে মূর্তিমান হয়েছে তা জানতে আগ্রহী।
অ্যান্ড্রু ডি আন্দ্রেড

আপনার অভিজ্ঞতা সম্পর্কে কোন নিবন্ধ, কাগজ বা ব্লগ আছে? এছাড়াও, আমি এটি সম্পর্কে আরও প্রযুক্তিগত বিশদ থাকতে চাই :)
ব্যবহারকারীর 1778770

@ ব্যবহারকারী 1778770 - সর্বজনীনভাবে উপলভ্য নয়, নেই। আপনার কি ধরণের প্রশ্ন ছিল?
টেলাস্টিন

ঠিক আছে, আসুন কিছু সাধারণ দিয়ে শুরু করা যাক, আপনার ধারণাটি পুরো অ্যাপ্লিকেশন স্ট্যাকটি বিস্তৃত করে (যেমন ব্যবসা থেকে শুরু করে সামনের দিকে) বা শুধুমাত্র একটি একক ব্যবহারের ক্ষেত্রে এক স্তর?
ব্যবহারকারী 1778770

@ ব্যবহারকারী 1778770 - আমার বাস্তবায়নে সত্তা / উপাদানগুলি একটি স্তরে বিদ্যমান। বিভিন্ন স্তরে বিভিন্ন সত্তা উপস্থিত থাকতে পারে তবে তারা প্রায়শই 1: 1 হয় না (অন্যথায় স্তরগুলি কোনও লাভ দেয় না)।
টেলাস্টিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.