সেটআপ
আমার একটি সত্তা-উপাদান আর্কিটেকচার রয়েছে যেখানে সত্তাগুলির বৈশিষ্ট্যের একটি সেট থাকতে পারে (যা কোনও আচরণের সাথে বিশুদ্ধ ডেটা নয়) এবং সেখানে এমন সিস্টেম রয়েছে যা সত্তার যুক্তি চালায় যা সেই ডেটাতে কাজ করে। মূলতঃ কিছুটা সিউডো-কোডে:
Entity
{
id;
map<id_type, Attribute> attributes;
}
System
{
update();
vector<Entity> entities;
}
একটি সিস্টেম যা কেবলমাত্র সমস্ত অস্তিত্বের সাথে ধ্রুবক হারে চলে আসে
MovementSystem extends System
{
update()
{
for each entity in entities
position = entity.attributes["position"];
position += vec3(1,1,1);
}
}
মূলত, আমি যথাসম্ভব দক্ষতার সাথে আপডেটের সমান্তরাল করার চেষ্টা করছি। সমান্তরালভাবে পুরো সিস্টেমগুলি চালিয়ে বা এক সিস্টেমের প্রতিটি আপডেট () প্রদানের মাধ্যমে এটি করা যেতে পারে যাতে বিভিন্ন থ্রেড একই সিস্টেমের আপডেট সম্পাদন করতে পারে তবে সেই সিস্টেমের সাথে নিবন্ধিত সংস্থার আলাদা সাবসেটের জন্য।
সমস্যা
প্রদর্শিত মুভিস্টিস্টেমের ক্ষেত্রে, সমান্তরালতা তুচ্ছ tri যেহেতু সত্তাগুলি একে অপরের উপর নির্ভর করে না এবং ভাগ করা ডেটা সংশোধন করে না, আমরা কেবল সমস্ত সত্ত্বাকে সমান্তরালে সরিয়ে নিতে পারি।
যাইহোক, এই সিস্টেমে কখনও কখনও প্রয়োজন হয় যে সত্ত্বাগুলি একে অপরের সাথে (/ থেকে ডেটা পড়তে / লেখার জন্য) যোগাযোগ করে, কখনও কখনও একই সিস্টেমের মধ্যে, তবে প্রায়শই একে অপরের উপর নির্ভরশীল বিভিন্ন সিস্টেমের মধ্যে থাকে।
উদাহরণস্বরূপ, একটি পদার্থবিজ্ঞানের সিস্টেমে কখনও কখনও সত্তা একে অপরের সাথে যোগাযোগ করতে পারে। দুটি বস্তুর সংঘর্ষ হয়, তাদের অবস্থানগুলি, বেগ এবং অন্যান্য বৈশিষ্ট্যগুলি সেগুলি থেকে পড়া হয়, আপডেট করা হয় এবং তারপরে আপডেট হওয়া বৈশিষ্ট্যগুলি উভয় সত্তায় আবার লেখা হয়।
ইঞ্জিনে রেন্ডারিং সিস্টেম সত্তা রেন্ডারিং শুরু করার আগে, অন্যান্য প্রাসঙ্গিক বৈশিষ্ট্যগুলি তাদের হওয়ার দরকার হয় তা নিশ্চিত করার জন্য এটি অন্যান্য সিস্টেমের কার্য সম্পাদনের জন্য অপেক্ষা করতে হবে।
আমরা যদি অন্ধভাবে এটির সাথে সমান্তরাল করার চেষ্টা করি তবে এটি শাস্ত্রীয় বর্ণের অবস্থার দিকে পরিচালিত করবে যেখানে বিভিন্ন সিস্টেম একই সাথে ডেটা পড়তে এবং সংশোধন করতে পারে।
আদর্শভাবে, এমন একটি সমাধান উপস্থিত থাকবে যেখানে সমস্ত সিস্টেম একই সময়ে একই ডেটা পরিবর্তন করে অন্য সিস্টেমগুলির বিষয়ে চিন্তা না করে এবং একই সাথে কার্যকর করার আদেশ এবং সমান্তরালকরণের বিষয়ে প্রোগ্রামার যত্ন না নিয়ে কোনও ইচ্ছার যে কোনও সত্তা থেকে ডেটা পড়তে পারে and এই সিস্টেমগুলি ম্যানুয়ালি (যা কখনও কখনও সম্ভব নাও হতে পারে)।
একটি মৌলিক প্রয়োগে, কেবলমাত্র সমস্ত ডেটা পাঠানো এবং সমালোচনামূলক বিভাগগুলিতে (মুটেক্সগুলি দিয়ে তাদের রক্ষা করা) রেখে এই অর্জন করা যায়। তবে এটি প্রচুর পরিমাণ রানটাইম ওভারহেডকে প্ররোচিত করে এবং সম্ভবত সম্পাদন সংবেদনশীল অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত নয়।
সমাধান?
আমার চিন্তাভাবনায়, একটি সম্ভাব্য সমাধান হ'ল এমন একটি ব্যবস্থা হবে যেখানে ডেটা পড়া / আপডেট করা এবং লেখার ব্যবস্থা আলাদা করা হয়, যাতে একটি ব্যয়বহুল পর্যায়ে সিস্টেমগুলি কেবলমাত্র ডেটা পড়ে এবং তাদের গণনা করার জন্য যা প্রয়োজন তা গণনা করে, কোনওভাবে ফলাফলকে ক্যাশে করে এবং তারপরে সমস্ত লিখুন পরিবর্তিত তথ্য পৃথক লিখন পাসে লক্ষ্য সত্তা ফিরে। সমস্ত সিস্টেম রাষ্ট্রের যে ডাটাতে ফ্রেমের শুরুতে ছিল তার উপর কাজ করবে এবং তারপরে ফ্রেমের সমাপ্তির আগে যখন সমস্ত সিস্টেম আপডেট করা শেষ করে, তখন সিরিয়ালযুক্ত রাইটিং পাস হয় যেখানে সমস্ত ভিন্ন থেকে ক্যাশে ফলাফল আসে happens সিস্টেমগুলির মাধ্যমে পুনরাবৃত্তি করা হয় এবং লক্ষ্য সত্ত্বায় ফিরে লেখা হয়।
এটি (সম্ভবত ভুল?) ধারণার উপর ভিত্তি করে তৈরি করা হয়েছে যে সহজ সমান্তরাল জয়ের ফলে ফলাফলের ক্যাচিং এবং লেখার পাসের ব্যয় (রানটাইম পারফরম্যান্সের পাশাপাশি একটি কোড ওভারহেড উভয়ই) ছাড়িয়ে যাওয়ার পক্ষে যথেষ্ট বড় হতে পারে।
প্রশ্নটি
অনুকূল কর্মক্ষমতা অর্জনের জন্য এই জাতীয় ব্যবস্থা কীভাবে প্রয়োগ করা যেতে পারে? এই জাতীয় ব্যবস্থার বাস্তবায়ন বিশদগুলি কী কী এবং কোনও সত্তা-উপাদান সিস্টেমের পূর্বশর্তগুলি কী কী এই সমাধানটি ব্যবহার করতে চায়?