ইভেন্ট ম্যানেজার সিস্টেম ডিজাইন করার সময় আমার কী বিবেচনা করা উচিত?


9

আমি একটি জাভা গেম ইঞ্জিনের ফান্ডামেন্টালগুলি নিয়ে ঘুরছি এবং আমি এমন একটি জায়গায় পৌঁছেছি যেখানে আমি ইভেন্ট ম্যানেজার সিস্টেমে যুক্ত করতে প্রস্তুত।

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

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

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

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


এই শব্দটি কি এই জাতীয় সিস্টেমটি বাস্তবায়নের দিকে যথাযথ দিকের মতো বলে মনে হচ্ছে, বা আমি ট্র্যাক বন্ধ করে দিচ্ছি এবং / অথবা বেশ স্পষ্ট কিছু মিস করছি?


2
gamedev.stackexchange.com/questions/7718/… এটি একটি প্রশ্ন / এআই আগে দেওয়া হয়েছিল যা আপনাকে শুরু করতে সহায়তা করতে পারে।
জেমস

@ জামেস আহ - দেখতে একটি ভাল লিঙ্কের মতো। ধন্যবাদ! আমি মনে করি আমি এর আগে মিস করেছি।
রেভেন ড্রিমার

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

উত্তর:


6

এটি আপনি চান হিসাবে সহজ হতে পারে।

for each object in the subscriber list:
    object.notify(this event) // (or 'HandleEvent' if you prefer)

কোনও ইভেন্ট ম্যানেজারকে 'করণীয়' কী করা উচিত তা চেষ্টা করুন না - আপনার যা করা দরকার তা নিয়ে কাজ করুন। বাকিদের সেখান থেকে অনুসরণ করা উচিত, বা কমপক্ষে আরও কিছু নির্দিষ্ট প্রশ্ন দেওয়া উচিত।


3
"1 এর জন্য 'এক্স' করা উচিত এবং চেষ্টা করবেন না - আপনার যা করা দরকার তা নিয়ে কাজ করুন + প্রকৃতপক্ষে, কোনও ইভেন্ট ম্যানেজারকে যুক্ত করবেন না যতক্ষণ না আপনার মনে হয় যে ফাংশনগুলি কল করার জন্য আপনার কোনও ডিকপলড-এখনও-কেন্দ্রীভূত উপায় প্রয়োজন need

@ জোব্রেসনিগ ওহ godশ্বর হ্যাঁ =) "আপনার যা করা দরকার তা নিয়ে কাজ করুন" এটি কোনও বিকাশকারীর মনে রাখা উচিত শীর্ষস্থানীয় 3 বিটের মধ্যে।
প্যাট্রিক হিউজেস

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

3

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

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

প্রেরণ ইভেন্টে কোনও ইভেন্ট সম্প্রচার করতে () এটি ভেক্টরের মাধ্যমে লুপিংয়ের মতো সহজ হতে পারে be আপনি ইভেন্টগুলির অগ্রাধিকার বা যে কোনও কিছু বাছাই করে প্রেরণে আরও জটিলতা যোগ করতে পারেন তবে আপনার প্রয়োজন না হওয়া পর্যন্ত এটি নিয়ে চিন্তা করবেন না। অনেক ক্ষেত্রে আপনার এটির প্রয়োজন হবে না।

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

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

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


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

0

DISCLAIMER পড়ুন

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

https://prdeving.wordpress.com/2017/04/03/event-driven-programming-with-c-89/

ইভেন্ট হ্যান্ডলিংয়ের বেসিকগুলি বেশ সহজ।

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

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

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

অবশ্যই, যখনই আপনি চান এই ইভেন্ট ডাইজেস্ট ট্রিগার করা যেতে পারে, উদাহরণস্বরূপ আপনি একবার আপনার Update()ফাংশন কল করার পরে প্রতি ফ্রেমে একবার ।


-2

ইভেন্ট ম্যানেজার-ফিল্ডের জন্য, একটি স্ট্যাটিক ভেরিয়েবল ব্যবহার করুন। ইভেন্ট ম্যানেজারের জন্য একটি সিঙ্গলটনও দুর্দান্ত ধারণা হবে।

আপনার পন্থাটি ভাল শোনাচ্ছে তবে এটিকে থ্রেড-নিরাপদ করতে ভুলবেন না।

"গেমএভেন্ট" এর আগে বা পরে আইও-ইভেন্টগুলি চালানো ভাল, সুতরাং প্রতিটি ফ্রেমে প্রতিটি "গেমএভেন্ট" একই ডেটা নিয়ে কাজ করে।


"থ্রেড সংরক্ষণ"? হুম
U62

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