সকেটগুলিতে এন ক্লায়েন্টদের সাথে যোগাযোগ করার জন্য টার্ন-ভিত্তিক সার্ভার লেখার জন্য কি কোনও প্যাটার্ন রয়েছে?


14

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

মোটামুটি আমার কাছে এটি রয়েছে:

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

আমার কাছে বর্তমানে যা আছে তা এখানে একটি চিত্র রয়েছে; বৃহত্তর / পঠনযোগ্য সংস্করণ, বা 66 কেবি পিডিএফ জন্য ক্লিক করুন ।

প্রবাহের অনুক্রমের ডায়াগ্রাম

সমস্যা:

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

চূড়ান্ত প্রয়োজনীয়তা:

  • পারফরম্যান্স সর্বজনীন নয়। এটি বেশিরভাগ অ-রিয়েলটাইম গেমগুলির জন্য ব্যবহৃত হবে এবং বেশিরভাগ ক্ষেত্রে একে অপরের বিরুদ্ধে এআই পিট করার জন্য ব্যবহৃত হবে, দুশ্চরিত্রা মানুষের নয়।

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

সার্ভারের বাস্তবায়নটি রুবিতে হয়, যদি এটি কোনও পার্থক্য করে।


আপনি যদি প্রতি ক্লায়েন্ট টিসিপি সকেট ব্যবহার করেন, তাহলে এই ক্যাপটি (65535-1024) ক্লায়েন্টকে দেবে না?
o0 '

1
লোহরিস কেন এমন সমস্যা? বেশিরভাগ লোকেরা 6000 একযোগে ব্যবহারকারী পেতে লড়াই করবেন,
60000

পছন্দ করুন আমার যদি 10 টিরও বেশি সমবর্তী AI থাকে তবে আমি অবাক হব। :)
ফ্রেগজ

কৌতূহলের বাইরে, আপনি এই চিত্রটি তৈরি করতে কোন সরঞ্জামটি ব্যবহার করেছিলেন?
ম্যাথিয়াস

@ মমথিয়াস দুঃখের বিষয়, অ্যাডোব ইলাস্ট্রেটারে এটি অনেক বেশি কাস্টম কাজ ছিল।
ফ্রেগজ

উত্তর:


10

আমি নিশ্চিত না যে এটি আপনি যা অর্জন করতে চান তা ঠিক। তবে, এমন একটি প্যাটার্ন রয়েছে যা গেম সার্ভারগুলিতে নিয়মিত ব্যবহৃত হয় এবং আপনাকে সাহায্য করতে পারে। বার্তার সারি ব্যবহার করুন।

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

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


1

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

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

প্রতিটি সকেটের একটি পালা আছে

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


1

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

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

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

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

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

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