আমি কেন বস্তুগুলিকে রেন্ডারিং থেকে আলাদা করব?


11

দাবি অস্বীকারকারী: আমি জানি যে কোনও সত্তার সিস্টেমের প্যাটার্নটি কী এবং আমি এটি ব্যবহার করছি না

আমি পৃথক বস্তু এবং রেন্ডারিং সম্পর্কে অনেক কিছু পড়েছি। গেম যুক্তি অন্তর্নিহিত রেন্ডারিং ইঞ্জিন থেকে স্বাধীন হওয়া উচিত About এগুলি সবই সুন্দর এবং জঘন্য এবং এটি সঠিক ধারণা দেয় তবে এটি অন্যান্য প্রচুর ব্যথার কারণও হয়:

  • লজিক অবজেক্ট এবং রেন্ডারিং অবজেক্টের মধ্যে সিঙ্ক্রোনাইজেশন প্রয়োজন (যেটি অ্যানিমেশনের অবস্থা রাখে, স্প্রাইটস ইত্যাদি)
  • রেন্ডারিং অবজেক্টটি লজিক অবজেক্টের আসল অবস্থা পড়ার জন্য জনগণের কাছে লজিক অবজেক্টটি খোলার প্রয়োজন (প্রায়শই লজিক অবজেক্টকে সহজেই বোবা গিটার এবং সেটার অবজেক্টে রূপান্তরিত করতে নেতৃত্ব দেয়)

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

গ্রাফিক উপস্থাপনা এবং গেম যুক্তিকে একত্রে বজায় রাখার (সিঙ্ক্রোনাইজেশনের সমস্যাগুলি এড়ানো) তবে রেন্ডারিং ইঞ্জিনটিকে অ্যাবস্ট্রাক্ট করার কোনও উপায় আছে কি? বা গেম লজিক এবং রেন্ডারিংকে আলাদা করার কোনও উপায় আছে যা উপরের ত্রুটিগুলি সৃষ্টি করে না?

(সম্ভবত উদাহরণ সহ আমি বিমূর্ত আলোচনা বুঝতে খুব ভাল নই)


1
আপনি সত্তা সিস্টেমের প্যাটার্নটি ব্যবহার করছেন না এবং আপনি কীভাবে সত্ত্বার উদ্বেগ থেকে রেন্ডারিংয়ের উদ্বেগকে পৃথক করবেন কিনা তার সাথে আপনার কী সম্পর্ক রয়েছে তা কী বলে আপনি কী বোঝাতে চান তার একটি উদাহরণ প্রদান করলে এটি সহায়ক হবে / খেলা যুক্তি।
michael.bartnett

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

উত্তর:


13

মনে করুন আপনার কাছে একটি দুনিয়া , প্লেয়ার এবং বসের সমন্বয়ে একটি দৃশ্য রয়েছে ওহ, এবং এটি তৃতীয় ব্যক্তি গেম, সুতরাং আপনার কাছে একটি ক্যামেরাও রয়েছে

সুতরাং আপনার দৃশ্যটি এর মতো দেখাচ্ছে:

class Scene {
    World* world
    Player* player
    Enemy* boss
    Camera* camera
}

(কমপক্ষে, এটি মূল ডেটা you আপনি কীভাবে ডেটা রাখেন তা আপনার উপর নির্ভর করে))

আপনি যখন খেলাটি খেলছেন তখনই আপনি দৃশ্যটি আপডেট এবং রেন্ডার করতে চান, যখন বিরতি দেওয়া হয় না বা মূল মেনুতে থাকে ... সুতরাং আপনি এটিকে গেমের সাথে যুক্ত করুন!

State* gameState = new State();
gameState->addScene(scene);

এখন আপনার গেমের রাজ্যের একটি দৃশ্য আছে। এরপরে, আপনি দৃশ্যে লজিক চালাতে চান এবং দৃশ্যটি রেন্ডার করতে চান। যুক্তির জন্য, আপনি কেবল একটি আপডেট ফাংশন চালান।

State::update(double delta) {
    scene->update(delta);
}

আপনি Sceneক্লাসে সমস্ত গেমের যুক্তি রাখতে পারেন । এবং কেবলমাত্র রেফারেন্সের জন্য, কোনও সত্তা উপাদান সিস্টেম এটি এর পরিবর্তে এটি করতে পারে:

State::update(double delta) {
    physicsSystem->applyPhysics(scene);
}

যাইহোক, আপনি এখন আপনার দৃশ্য আপডেট করতে পরিচালনা করেছেন। এখন আপনি এটি প্রদর্শন করতে চান! যার জন্য আমরা উপরের মতো কিছু করি:

State::render() {
    renderSystem->render(scene);
}

এই নাও. রেন্ডারসিস্টেমটি দৃশ্য থেকে তথ্যটি পড়ে এবং উপযুক্ত চিত্রটি প্রদর্শন করে। সরলীকৃত, দৃশ্যের রেন্ডারিংয়ের পদ্ধতিটি দেখতে এরকম হতে পারে:

RenderSystem::renderScene(Scene* scene) {
    Camera* camera = scene->camera;
    lookAt(camera); // Set up the appropriate viewing matrices based on 
                    // the camera location and direction

    renderHeightmap(scene->getWorld()->getHeightMap()); // Just as an example, you might
                                                        // use a height map as your world
                                                        // representation.
    renderModel(scene->getPlayer()->getType()); // getType() will return, for example "orc"
                                                // or "human"

    renderModel(scene->getBoss()->getType());
}

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

আমি আশা করি এটি কি আপনি খুঁজছিলেন? আপনি উপরের দিক থেকে আশা করতে পারেন যেহেতু রেন্ডার সিস্টেমটি গেমটির যুক্তি সম্পর্কে চিন্তা করে না । এটি কেবলমাত্র রেন্ডার করার জন্য দৃশ্যের বর্তমান অবস্থা ব্যবহার করে, অর্থাত এটি রেন্ডার করার জন্য এটি থেকে প্রয়োজনীয় তথ্য টেনে তোলে। এবং গেম যুক্তি? রেন্ডারার কী করে তা বিবেচ্য নয়। মুরগি, এটা আদৌ প্রদর্শিত হয় কিনা তা চিন্তা করে না!

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

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

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


7

আপনার শিরোনাম আপনার দেহের সামগ্রীর চেয়ে আলাদা প্রশ্ন জিজ্ঞাসা করে। শিরোনামে, আপনি কেন যুক্তি এবং উপস্থাপনা পৃথক করা উচিত তা জিজ্ঞাসা করেছেন, তবে শরীরে আপনি লজিক / গ্রাফিক্স / রেন্ডারিং সিস্টেমগুলি প্রয়োগের জন্য বলছেন।

দ্বিতীয় প্রশ্নটি আগে সম্বোধন করা হয়েছিল , তাই আমি প্রথম প্রশ্নের দিকে মনোনিবেশ করব।

যুক্তি এবং রেন্ডারিংকে আলাদা করার কারণগুলি:

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

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


6

এই উত্তরটি কেবল ব্যবহারিক উদাহরণগুলির পরামর্শ দেওয়ার পরিবর্তে রেন্ডারিং এবং লজিককে আলাদা করা কেন গুরুত্বপূর্ণ তা অন্তর্দৃষ্টি তৈরি করার জন্য to

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

হাতি তার সমস্ত বিবরণ সহ গেমের বিষয়টিকে উপস্থাপন করে। তবে কারও কারও পক্ষে আসলে হাতির (গেম অবজেক্ট) এর কার্যকারিতাটি সম্পাদন করতে সক্ষম হওয়া সম্পর্কে সমস্ত কিছু জানতে হবে না।

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

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

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

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

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

আইডিয়াটি ব্যাখ্যা করার জন্য একটি সাধারণ দৃশ্যের গ্রাফ উদাহরণ গ্রহণ করি।

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

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

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