আমি কি ইভেন্ট হ্যান্ডলারের সাথে পাগল হতে পারি? আমি কি আমার নকশাটি নিয়ে "ভুল পথে" যাচ্ছি?


12

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

আমার গেম ইঞ্জিন বর্তমানে প্যানিং ওভারহেড ক্যামেরার সাথে বেসিক স্প্রাইট-ভিত্তিক রেন্ডারিং করে। আমার ডিজাইনটি দেখতে কিছুটা এ জাতীয় দেখাচ্ছে:

SceneHandler

ক্লাসগুলির একটি তালিকা রয়েছে যা দৃশ্যপরিচালিত ইন্টারফেস (বর্তমানে কেবলমাত্র স্প্রাইটস) প্রয়োগ করে। কলগুলি প্রতি টিকিটে একবার রেন্ডার () করে এবং ক্যামেরাপেডেট () পাঠায়; SceneListeners যাও বার্তা।

InputHandler

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

AgentHandler

যেকোন এজেন্টদের (এআই) একবার টিক প্রতি একবার ডিফল্ট ক্রিয়াকলাপ কল করে এবং নিবন্ধিত যে কোনও নতুন ইভেন্টের জন্য স্ট্যাক পরীক্ষা করে এটি প্রয়োজনীয় এজেন্টগুলিতে প্রেরণ করে।

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

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

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

উত্তর:


21

ইভেন্ট ভিত্তিক নকশায় বেশিরভাগ চুল্লি ডিজাইন প্যাটার্ন প্রয়োগ করা জড়িত ।

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

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

আপনি যখন যথাযথ জটিলতার সাথে প্রতিটি অ্যাপ্লিকেশন বিকাশ করবেন আপনি তাড়াতাড়ি বা পরে, এমন কিছু হ্যান্ডলারের মুখোমুখি হবেন যা একটি জটিল কাজ করতে সময় প্রয়োজন

এই ক্ষেত্রে আপনি দুটি পরিস্থিতি আলাদা করতে পারবেন (অগত্যা পারস্পরিক একচেটিয়া নয়):

জটিল ইভেন্ট সম্পর্কিত জটিলতা এবং জটিল ইভেন্ট-সম্পর্কিত সম্পর্কহীন দায়িত্ব।

জটিল ঘটনা সম্পর্কিত দায়িত্ব:

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

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

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

জটিল ঘটনা সম্পর্কিত-সম্পর্কিত নয়:

দ্বিতীয় ঘটনাটি ঘটে যখন কোনও ইভেন্টের পরে গ্রহণের পদক্ষেপে অভ্যন্তরীণ জটিলতা থাকে: উদাহরণস্বরূপ আপনাকে কোনও ইভেন্টের পরে একটি ফাইবোনাকি নম্বর গণনা করতে হবে।

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

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

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

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

কাজের সারিবদ্ধ পরিচালক নিম্নলিখিত কাজগুলি করেন:

  • এটি পুলটি একটি থ্রেড সরবরাহ করতে সক্ষম হলে তার শ্যাডুল অ্যালগরিদম ব্যবহার করে নমনীয় থ্রেড পুল থেকে একটি থ্রেডে একটি চাকরীর ইউনিট বরাদ্দ করে (সেখানে একটি মুক্ত থ্রেড বা একটি নতুন থ্রেড তৈরি অনুমোদিত)

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

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


3
খুব পুঙ্খানুপুঙ্খ হওয়ার জন্য +1। কৌতূহলী পাঠকের জন্য কয়েকটি লিঙ্ক দুর্দান্ত থাকবে।
সাম হোচেভার

1

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

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