কোনও নেটওয়ার্ক স্ট্রিমকে কীভাবে সিঙ্ক্রোনাইজ করা যায়?


12

প্রসঙ্গ

গেমটিতে আমি কাজ করছি (একটি বিন্দু এবং গ্রাফিক অ্যাডভেঞ্চারের এক ধরণের ক্লিক), গেমের জগতে ঘটে যাওয়া সমস্ত কিছু অ্যাকশন ম্যানেজার দ্বারা নিয়ন্ত্রিত হয় যা কিছুটা কাঠামোযুক্ত:

এখানে চিত্র বর্ণনা লিখুন

সুতরাং উদাহরণস্বরূপ, যদি কোনও বস্তুর পরীক্ষার ফলাফলটি চরিত্রটিকে হ্যালো বলে, কিছুটা হাঁটতে এবং তারপরে বসে থাকে তবে আমি কেবল নীচের কোডটি স্প্যান করেছিলাম:

var actionGroup = actionManager.CreateGroup();
actionGroup.Add(new TalkAction("Guybrush", "Hello there!");
actionGroup.Add(new WalkAction("Guybrush", new Vector2(300, 300));
actionGroup.Add(new SetAnimationAction("Guybrush", "Sit"));

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

সমস্যা

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

var actionManager = new List<List<string>>();

উপরের ডেটা স্ট্রাকচারের সামগ্রীগুলি সমস্ত খেলোয়াড়ের মধ্যে সিঙ্ক্রোনাইজ করার জন্য কীভাবে আমি এগিয়ে যেতে পারি?

মূল প্রশ্নটি ছাড়াও, আমি এর সাথে সম্পর্কিত কয়েকটি অন্যান্য উদ্বেগও বোধ করছি (যেমন উপরে একই সমস্যার সম্ভাব্য সমস্ত প্রভাব):

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

5
বাধ্যতামূলক "এই প্রথমটি পড়ুন" লিংক gafferongames.com / নেটওয়ার্কিং- for-game-pogrammers যা কিছু কোড থাকা সত্ত্বেও খুব প্রযুক্তিগত নয় তবে এটি শব্দযুক্ত এবং আপনার বিকল্পগুলি মোটামুটি সুন্দরভাবে ব্যাখ্যা করে। এছাড়াও এটি আপনাকে যে সকল লিঙ্কটি পড়েছে তাদের সাথে সমান পদক্ষেপ নেবে এবং এটি একটি খুশির জায়গা।
প্যাট্রিক হিউজেস

@ পেট্রিকহাগস লিঙ্কটির জন্য ধন্যবাদ! আমি অবশ্যই এটি সব পড়তে হবে।
ডেভিড গওভিয়া

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

উত্তর:


9

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

এই ক্ষেত্রে আপনার কাছে তিনটি বিকল্প রয়েছে যার মধ্যে দুটি ইতিমধ্যে আপনি উল্লেখ করেছেন have আপনি যে বিকল্পটি গ্রহণ করছেন তা নির্বাচন বিভিন্ন কারণের উপর নির্ভর করে যে কেবলমাত্র আপনিই সেরা বিচারক হতে পারেন:

1: ক্লায়েন্ট স্প্যানস গোষ্ঠী ক্রিয়াকলাপগুলি তাদের সরাসরি যুক্ত করে এবং তারপরে সার্ভারে প্রেরণ করে। সার্ভার এটি কোনও চেক ছাড়াই গ্রহণ করে

* এই পদ্ধতির সুবিধাগুলি হ'ল ক্লায়েন্টের সাথে সম্পর্কিত, তাদের নিজস্ব ক্রিয়াকলাপগুলি তাদের নেটওয়ার্ক বিলম্বের চেয়ে তাত্ক্ষণিক প্রতিক্রিয়া জানায়। অসুবিধাটি হ'ল ক্লায়েন্টের বার্তাগুলি সার্ভারের দ্বারা সত্য হিসাবে গৃহীত হয় (যা তারা নাও হতে পারে) *

2: ক্লায়েন্ট সার্ভারে একটি অনুরোধ প্রেরণ করে, যার ফলে অনুরোধটি উত্পন্ন ক্লায়েন্ট সহ সকলের কাছে অনুরোধটি সম্প্রচারিত করে।

এই পদ্ধতির সুবিধাগুলি হ'ল সার্ভারটি এখন গেমটিতে ঘটে যাওয়া সমস্ত কিছুর নিয়ন্ত্রণে থাকে যা বেশিরভাগ বিষয়কে অবৈধ ক্রিয়াকলাপ থেকে দূরে সরিয়ে দেয় (এখানে অবৈধ ক্লায়েন্ট থেকে দেওয়াল ক্লিপিং থেকে শুরু করে চলন চালানো অবধি হতে পারে যা এখন অবৈধ কারণ সার্ভারটি আছে ক্লায়েন্ট যখন নির্দিষ্ট পদক্ষেপ নিয়েছিল তখন ক্লায়েন্টের কাছে আরও তথ্য নেই)

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

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

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

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

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

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

যদি আমি একবারে অনেকগুলি ক্রিয়া যুক্ত করি তবে কী সংযোগের জন্য সমস্যা সৃষ্টি করবে না? কোন উপায়ে তা দূর করতে?

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

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

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

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

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


বিস্তারিত প্রতিক্রিয়াটির জন্য অনেক ধন্যবাদ, এটি আমার সমস্ত উদ্বেগকে কভার করে। আপনি যে অংশটি বলছেন সে সম্পর্কে কেবল একটি প্রশ্ন so every second, the server sends everything ... which the client then snaps to। আমি কি একবারে এই জাতীয় একটি বিশাল পরিমাণ তথ্য প্রেরণ করতে পারি? একটি যুক্তিসঙ্গত সর্বোচ্চ আকার কি?
ডেভিড গওভিয়া

যুক্তিসঙ্গত সর্বাধিক এমন একটি সংখ্যা হবে যা পিছিয়ে নেই:) ... আমি জানি আপনি এই উত্তরটি খুঁজছিলেন না তবে আমি কোনও নম্বর লিখতে চাই না কারণ আমি আপনার গেমের সাথে পরিচিত নই।
সমুরসার

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

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

@ ক্রিস: আমি একমত নই :) :) টিসিপি এবং ইউডিপি ব্যবহারের সিদ্ধান্তটি (ইমো) উন্নয়নের জন্য পাইথন এবং সি ++ বেছে নেওয়ার সিদ্ধান্তের মতো। তাত্ত্বিকভাবে এটি ঠিক মনে হতে পারে, তবে বাস্তবে এটি সহজভাবে স্যুইচ করা কঠিন হবে (আবার, এটি ইমো)।
সমুরসার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.