কোনও ইভেন্ট সিস্টেম সেট আপ করার জন্য এর চেয়ে ভাল উপায় আছে কি?


9

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

বর্তমানে আমার দুটি পদ্ধতি রয়েছে:

  1. সর্বাধিক: যখন কোনও ইভেন্ট প্রেরণ করা হয় তখন সমস্ত বস্তুগুলিকে একটি ভেক্টরে যুক্ত করা হয় যখন সমস্ত অবজেক্টগুলিকে ইভেন্টটি হ্যান্ডেল_উভেন্ট () পদ্ধতির মাধ্যমে প্রেরণ করা হয়

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

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

দ্রুত (রান টাইম ওয়াইজ) উপায় আছে কি? স্ট্রিংয়ের ধরণ থেকে কোন int দেখার জন্য আরও দ্রুত উপায় আছে? (প্রথমদিকে আমার একটি এনাম ছিল, তবে এটি কাস্টম প্রকারের অনুমতি দেয় নি, যা গতিরোধের পছন্দসই স্তরের কারণে প্রয়োজনীয়))


1
এটি হ্যাশ ম্যাপস (বা হ্যাশ টেবিল) এর জন্য যা সেগুলি হ'ল স্ট্রিংটি হ্যাশ সংখ্যায় কমিয়ে দেওয়া হয় যা সরাসরি অ্যারেতে সন্ধান করতে ব্যবহৃত হয়। en.wikedia.org/wiki/Hash_table
প্যাট্রিক হিউজেস

একটি ভাল প্রশ্ন হ'ল: এটি কি আসলেই কোনও পারফরম্যান্সের বাধা, না আপনি কি অকালে চিন্তিত?
জারি কম্প্পা

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

100 কে অবজেক্টগুলি কেবল একটি গেমের জন্য ভয়াবহ উচ্চ শোনায়। এটি কি কোনও সার্ভার বা শেষ ব্যবহারকারী ক্লায়েন্টের অ্যাপ্লিকেশন?
প্যাট্রিক হিউজেস

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

উত্তর:


5

দেখে মনে হচ্ছে আপনি বড় পারফরম্যান্সের বাধা তাদের স্ট্রিংয়ের নাম থেকে ইভেন্ট আইডি (পূর্ণসংখ্যা) সন্ধান করছেন। গেমটি চালানোর আগে বা সম্ভবত স্তরটি লোড করার সময় আপনি সমস্ত ইভেন্টের নামকে পূর্ণসংখ্যায় রূপান্তর করতে আপনার গেমের ডেটা প্রিক্রস করতে পারেন; তাহলে গেমপ্লে চলাকালীন আপনাকে কোনও রূপান্তর করতে হবে না।

যদি বস্তুগুলি প্রায়শই তৈরি করা হয় এবং ধ্বংস করা হয় তবে অবজেক্টগুলির ভেক্টরগুলিতে প্রচুর মন্থ হতে পারে। এই ক্ষেত্রে আপনি ভেক্টরগুলির পরিবর্তে লিঙ্কযুক্ত তালিকা ব্যবহার করে উপকৃত হতে পারেন; সন্নিবেশ এবং মোছার জন্য এগুলি দ্রুত।


বাধা বড় নয় (100,000 বস্তুর জন্য এটি হারায় .0000076 এমএস / অবজেক্ট) তবে আমি মনে করি আপনার ধারণাটি দুর্দান্ত ধারণা! আমি মনে করি আমি আসলে আইডিটির এক সময়ের অনুসন্ধান করব এবং আসল স্ট্রিং ডেটার পরিবর্তে ইভেন্টআইডিটি ইনট হিসাবে সংরক্ষণ করব। এবং আমি আসলে লিঙ্কযুক্ত তালিকার কথা ভাবি নি, ভাল ধারণা।
আলফিনিটিস

1
আইডিগুলি প্রিপ্রোসেসিংয়ের জন্য +1। প্রতিটি মডিউল এর মতো কোনও কিছু পেতে পারে এমন ইভেন্ট টাইপ টাইপ করেও আপনি অলসভাবে এটি করতে পারেন EventType takeDamageEvent = EventSystem::CacheEventType("takeDamageEvent");। এটিকে ক্লাসের একটি অচল সদস্য করুন এবং আপনার প্রয়োজন প্রতিটি ক্লাসে কেবল একটি কপি ভাসমান।
michael.bartnett

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

2

ঠিক আছে, আসুন প্রথমে সরল জিনিসগুলি বের করা যাক। আপনার এটি mapস্ট্রিং (ইভেন্টের নাম, সম্ভবত) এবং পূর্ণসংখ্যার (নিবন্ধিত ইভেন্ট শ্রোতার সূচক) এর মধ্যে রয়েছে।

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

ধরে নেওয়া যাক আপনি std::stringএবং operator<তুলনার জন্য ব্যবহার করছেন । এটি অত্যন্ত অদক্ষ; এটি একটি বাইট-ভিত্তিক তুলনা করে। আপনি তুলনায় কম আসল স্ট্রিং সম্পর্কে চিন্তা করবেন না; আপনার কেবল কিছু ধরণের তুলনা প্রয়োজন যা একটি কঠোর-দুর্বল ক্রম দেয় (কারণ mapঅন্যথায় কাজ করে না)।

সুতরাং আপনার পরিবর্তে একটি 32-বাইট স্থির দৈর্ঘ্যের স্ট্রিং ব্যবহার করা উচিত std::string। আমি এগুলি সনাক্তকারীদের জন্য ব্যবহার করি। এই নির্দিষ্ট স্ট্রিংগুলির জন্য তুলনা পরীক্ষাগুলি বাই-ভিত্তিক তুলনা করে না; পরিবর্তে তারা 32-বিট (বা 64-বিট) তুলনা করে। এটি স্বাক্ষরবিহীন পূর্ণসংখ্যার হিসাবে প্রতি 4 বাইট নেয় এবং অন্যান্য স্ট্রিংয়ের সাথে সম্পর্কিত 4 ​​বাইটের সাথে এটি তুলনা করে। এইভাবে, তুলনাটি কেবলমাত্র 8 টি তুলনা করে। এটি একটি কঠোর-দুর্বল ক্রমকে নিশ্চিত করে, যদিও অর্ডারটির সাথে অক্ষর হিসাবে ডেটার কোনও সম্পর্ক নেই।

31 বাইটের বেশি দীর্ঘ স্ট্রিং সংরক্ষণ করা (NULL অক্ষর প্রয়োজন) স্ট্রিংটি কাটা হয় (তবে মাঝের দিক থেকে, প্রান্তগুলি থেকে বরং find এবং প্যাডের চেয়ে ছোট স্ট্রিংগুলি এর সাথে বাকি অক্ষরগুলি আউট করে \0

এখন, আপনি mapপুরোপুরি খাঁজ করতে পারেন এবং একটি হ্যাশ টেবিল ব্যবহার করতে পারেন। আপনার যদি ইভেন্টের বিভিন্ন ধরণের 100,000 এরও বেশি থাকে তবে এটি ভাল ধারণা হতে পারে। তবে আমি এমন কোনও গেম সম্পর্কে জানি না যেখানে এটি দূর থেকে যুক্তিসঙ্গত জিনিস হতে পারে।


সুতরাং আপনার std :: স্ট্রিংয়ের পরিবর্তে একটি 32-বাইট স্থির দৈর্ঘ্যের স্ট্রিং ব্যবহার করা উচিত। ফ্যান্টাস্টিক! আমি স্ট্রিংয়ের ধরনটি পরিবর্তন করার চিন্তা করিনি।
আল্টিফিনিটাস

0

সাধারণ প্রশ্নের উত্তর দিতে:

ইভেন্ট সিস্টেম সেটআপ করার আরও ভাল উপায়

কেউ নেই. আপনি যা করতে পারেন তা হ'ল আপনার ইভেন্ট সিস্টেমগুলির জন্য নির্দিষ্ট প্রয়োজনীয়তাগুলি সনাক্ত করতে হবে (বেশ কয়েকটি আলাদা হতে পারে) এবং তারপরে সঠিক কাজের জন্য সঠিক সরঞ্জামটি ব্যবহার করুন।

আমি প্রচুর ইভেন্ট সিস্টেম বাস্তবায়ন করেছি এবং সাধারণ করার চেষ্টা করেছি এবং আমি এই সিদ্ধান্তে পৌঁছেছি। কারণ আপনি যদি এটিকে কম্পাইল-টাইম বা রান-টাইম করে তৈরি করেন, যদি আপনি অবজেক্ট হায়ারারচি বা ব্ল্যাকবোর্ড ইত্যাদি ব্যবহার করেন তবে ট্রেড অফগুলি সত্যই আলাদা are

সর্বোত্তম উপায় হ'ল বিভিন্ন ধরণের ইভেন্ট সিস্টেমগুলি অধ্যয়ন করা এবং তারপরে কোনটি কোন ক্ষেত্রে ব্যবহার করা উচিত সে সম্পর্কে আপনার ক্লু।

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

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