উপাদানগুলি কখন / কোথায় আপডেট করবেন


10

আমার স্বাভাবিক উত্তরাধিকারী ভারী গেম ইঞ্জিনগুলির পরিবর্তে আমি আরও বেশি উপাদান ভিত্তিক পদ্ধতির সাথে টয়িং করছি। তবে উপাদানগুলি তাদের জিনিসটি কোথায় করতে দেবে তা ন্যায্যতা জানাতে আমার একটি কঠিন সময় আছে।

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

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

সুতরাং আমার প্রশ্নটি হল, আমি উপাদানগুলি কোথায় আপডেট করব, সেগুলি ম্যানেজারদের কাছে পাওয়ার একটি পরিষ্কার উপায় কী?

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


1
আপনি কি কোনও উপায়ে সিস্টেম ব্যবহার করছেন?
আসকারন

কম্পোনেন্ট সিস্টেমগুলি এটি করার স্বাভাবিক উপায়। আমি ব্যক্তিগতভাবে কেবলমাত্র সমস্ত উপাদানগুলিতে আপডেট কল করি, যা সমস্ত উপাদানগুলিতে আপডেট কল করে এবং কয়েকটি "বিশেষ" কেস রয়েছে (যেমন সংঘর্ষ সনাক্তকরণের জন্য স্থানীয় পরিচালক, যা স্থির) which
ashes999

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

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

1
আমি এই বিষয়ে এখানে এক ধরনের মায়াময়
অ্যালেক্সফক্সগিল

উত্তর:


15

আমি মাইক অ্যাক্টনের 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 ডি মডেল সেট করুন)। নোট করুন যে ম্যানেজারটি কোনও উপায়ে বাইরের বিশ্বের কাছে একটি ব্ল্যাক বক্স রয়েছে। আমরা জানি না যে প্রতিটি উপাদানগুলির ডেটা কীভাবে সংরক্ষণ করা হয়। আমরা জানি না যে প্রতিটি উপাদান কীভাবে আপডেট হয়। যতক্ষণ না উপাদানগুলি তাদের উচিত আচরণ করবে ততক্ষণ আমাদের যত্ন নেই।

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

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

এটি পাখির চোখের দর্শন, এর উপাদান পরিচালকরা কীভাবে কাজ করে তা একবার দেখে নেওয়া যাক। আপনার যা প্রয়োজন তা এখানে:

  • তৈরি করতে (অ্যান্টিআইডিডি) ডাকা হলে উপাদান ডেটা তৈরি করুন
  • অপসারণ (অ্যান্টিআইডি) বলা হওয়ার পরে উপাদান ডেটা মুছুন
  • আপডেট () কল করার সময় সমস্ত (প্রযোজ্য) উপাদান ডেটা আপডেট করুন (যেমন সমস্ত উপাদান প্রতিটি ফ্রেম আপডেট করার প্রয়োজন হয় না)

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

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

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

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


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

1
এটিকে বাদ দিয়ে আপনি কী বোঝাতে চাইছেন? আপনি কি কোনও সত্তা শ্রেণি ব্যতীত কোনও সত্তা সিস্টেমকে বোঝাচ্ছেন? আর্টেমিসের সত্তার কারণ হ'ল আর্টেমিসে, সত্তা শ্রেণি তার নিজস্ব উপাদানগুলি পরিচালনা করে। আমি প্রস্তাবিত সিস্টেমে কম্পোনেন্টম্যানেজার ক্লাসগুলি উপাদানগুলি পরিচালনা করে। সুতরাং কোনও সত্তা শ্রেণীর প্রয়োজনের পরিবর্তে আপনার কেবল একটি অনন্য পূর্ণসংখ্যা আইডি থাকতে পারে। সুতরাং আসুন আমরা বলি যে আপনার সত্তা 254 রয়েছে, যার একটি অবস্থান উপাদান রয়েছে। আপনি যখন অবস্থানটি পরিবর্তন করতে চান, তখন আপনি ID পরামিতি হিসাবে 254 সহ পজিশনকম্পগ্রিজিটারসেটপজিশন (int id, Vector3 newPos) কল করতে পারবেন।
মার্ট

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

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

1
একটি উপাদান থেকে অন্য সত্তায় একটি উপাদান সরান? প্রতিটি কম্পোনেন্টম্যানেজারে কেবল একটি ফাংশন swapComponentOwner (int oldEntity, int newEntity) যুক্ত করুন। কম্পোনেন্টম্যানেজারে ডেটা সবই রয়েছে, কোন মালিকের মালিক তা পরিবর্তন করার জন্য আপনার কেবল একটি ফাংশন প্রয়োজন। প্রতিটি কম্পোনেন্টম্যানেজারের কোনও সূচক বা মানচিত্রের মতো কিছু থাকবে যা কোন সত্তা আইডির সাথে সম্পর্কিত data পুরানো থেকে নতুন আইডিতে সত্তা আইডিটি পরিবর্তন করুন। আমি নিশ্চিত না যে সিস্টেমে উপাদানগুলি ভাগ করে নেওয়া সহজ হয়েছিল আমি ভেবেছি সেই পদ্ধতিতে, তবে এটি কতটা কঠিন হতে পারে? একটি সত্তা আইডির পরিবর্তে <-> সূচক টেবিলের অংশের ডেটা লিঙ্কটিতে একাধিক রয়েছে।
মার্ট

3

এই উপাদানগুলির কাজ করার জন্য তাদের প্রতিটি ফ্রেম আপডেট করতে হবে, এটি করার সহজতম উপায় হ'ল দৃশ্য গাছের উপর দিয়ে হাঁটা এবং তারপরে প্রতিটি সত্তার জন্য প্রতিটি উপাদান আপডেট করা update

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

  1. আপনি ঘন ঘন বিবিধ প্রকারের উপাদানগুলি আপডেট করার সম্ভাবনা (রেফারেন্সের দরিদ্র কোড স্থানীয়ত্ব, মূলত)
  2. এই সিস্টেমটি সাম্প্রতিক আপডেটগুলিতে নিজেকে ভাল leণ দেয় না কারণ আপনি ডেটা নির্ভরতা সনাক্তকরণের মতো অবস্থানে নেই এবং এইভাবে সম্পর্কিতগুলি সম্পর্কিত সম্পর্কিত স্থানীয় গ্রুপগুলিতে আপডেটগুলি বিভক্ত করুন।

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

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

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

আপনি আপনার গেম সত্তা সংমিশ্রণ সিস্টেমে যে উপাদানগুলি ব্যবহার করেন সেগুলি কেবল সেই নিম্ন-স্তরের সিস্টেমগুলি থেকে wra

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

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

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