আমি জানি যে আমার সুপার সিম্পল মাল্টিপ্লেয়ার সেটআপ সম্ভবত কোনও ভাল ধারণা নয় তবে কেন?


11

আমি কেবল মজাদার জন্য একটি সাধারণ সামান্য MOBA তৈরি করছি। আমি সবকিছুকে একক খেলোয়াড় তৈরি করছিলাম তখন আমি বুঝতে পারি "ওহ ক্রেপ আমার সম্ভবত মাল্টিপ্লেয়ার যুক্ত করা উচিত, হু"।

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

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

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

সুতরাং মূলত:

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

আমি কীভাবে বড় গেমগুলি মাল্টিপ্লেয়ার করে তা দেখার জন্য আমি স্টাফের মধ্য দিয়ে ঝাঁপিয়ে পড়েছি, এবং এই স্টাফটিতে কেবল ছড়িয়ে পড়া শুরু করা এমন ব্যক্তির পক্ষে এটি বিভ্রান্তিকর একরকম, তবে দেখে মনে হচ্ছে উত্স ইঞ্জিনটি সমস্ত কিছুতে সমস্ত পরিবর্তনযুক্ত একটি প্যাকেট প্রেরণ করে the বিশ্বের প্রতিটি টিক? আবার, এই স্টাফটিতে সম্পূর্ণ নতুন, তবে আপনি কি সত্যিই এত ঘন ঘন ডেটাটি চাপতে পারেন?

দুঃখিত যদি এটি কিছুটা র‌্যাম্পলি হয় তবে মূলত আমি ভাবছিলাম যে আমার সরল ব্যবস্থাটি কেন সঠিক পথটি নয়, কারণ যদি তা হয় তবে অন্যান্য গেমগুলি এটি ব্যবহার করবে, তাই না?


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

1
আশ্চর্যজনক বিষয়টি হ'ল আমাদের বাকী লোকদের কাছে যুক্তিসঙ্গত আশা আছে যে নেটওয়ার্কটি এতটা শক্ত নয়। এটা করণীয়
ashes999

উত্তর:


12

বাইট 5 এর উত্তর ছাড়াও আরও কয়েকটি বিষয় বিবেচনা করতে হবে:

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

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

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

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

আরও ধারণাগুলির জন্য, আমি দ্বিতীয় লিঙ্কের অন্যান্য নিবন্ধগুলি ব্রাউজ করার পরামর্শ দিচ্ছি।

শুভকামনা!


6

আপনি যা বর্ণনা করছেন তা মূলত ক্লায়েন্টের পক্ষের পূর্বাভাস , তবে সার্ভার এবং ক্লায়েন্টের সাথে একমত না হলে কী হয় তা আপনি বলবেন না।

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

পরবর্তী পদক্ষেপগুলি হল আপনি কীভাবে মতবিরোধের প্রতিক্রিয়া জানালেন। যদি এর জন্য আপনার কাছে কিছু না থাকে, ক্লায়েন্ট এবং সার্ভারের সাথে একমত না হলে আপনি ক্লায়েন্ট রাবার-ব্যান্ডিং বা টেলি-পোর্টিং পাবেন।


5

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

ধরে নিন যে প্রত্যেকে আসার সাথে সাথে প্যাকেটে কাজ করে।

@ Time 0 (wall time), Player 1 puts up a shield   (Message has been sent, but not received by anyone)
@ Time 1, Player 2 shoots player 1   (Message has been sent, but not received by anyone)

ধরুন সময় 0 (টি 0) এবং টি 1 একত্রে কাছাকাছি রয়েছে।

এরপরে যা ঘটে তা নির্ভর করে কে এটি দেখছে এবং প্যাকেটগুলি ক্রমটি সার্ভারে পৌঁছেছে তার উপর। সার্ভারের সর্বদা চূড়ান্ত বক্তব্য থাকা উচিত। সার্ভার যদি উপরে বর্ণিত ক্রমানুসারে প্যাকেটগুলি গ্রহণ করে তবে শট এবং প্লেয়ার 1 (পি 1) বেঁচে থাকার আগে সার্ভারটি ieldালটি প্রয়োগ করবে। পি 1 এর দৃষ্টিকোণ থেকে, theালটি নিজেই রেখে দেওয়ার পরে, তিনি শটটির আগে ঝালটি দেখতে পাবেন এবং বেঁচে থাকবেন। তবে পি 2 নিয়ে কী হবে? তারা গুলি চালিয়েছিল বলে তারা ঠিক এখনই দেখতে পাবে, তবে তারা কি প্রথমে ঝালটি দেখতে পাবে? যদি (T0 + latency between P1 and the server + the latency between the server and P2) > T1, শটের পরে ঝালটি উঠে আসে এবং পি 2 মনে করে তাদের শট পি 1 কে হত্যা করেছে। সার্ভারকে কোনওভাবে এই পরিস্থিতি সংশোধন করতে হবে।

তবে, সার্ভারটি বিপরীত ক্রমে প্যাকেটগুলি গ্রহণ করে (এটি বেশ সম্ভব, এমনকি T0 <T1 হলেও), তারপরে বিপরীতটি ঘটে। পি 1 ভুল (এবং মৃত), যখন পি 2 সঠিক (এবং বিজয়ী)।

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

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

সময় কি মজা? আপনি যা করছেন তা শেষ না করা, এই সময়ের সমস্যা সম্পর্কে সচেতন হওয়া সহায়ক।

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