ভূমিকম্প 3 এর মতো নির্ভুলতা নেটওয়ার্ক গেমগুলির জন্য কীভাবে সার্ভার-ক্লায়েন্টের ঘড়িগুলিকে ইন-সিঙ্ক রাখবেন?


15

আমি একটি 2 ডি টপ-ডাউন-শ্যুটারে কাজ করছি এবং কোয়েক 3 এর মতো নেটওয়ার্ক গেমগুলিতে ব্যবহৃত ধারণাগুলি অনুলিপি করার জন্য যথাসাধ্য চেষ্টা করছি।

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

আমি যে সমস্যার মুখোমুখি হচ্ছি তা হ'ল "ক্লক সিঙ্ক্রোনাইজেশন"।

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

আমি প্রতিবার একটি স্ন্যাপশট প্রাপ্ত হওয়ার সাথে সাথে সার্ভার এবং ক্লায়েন্ট ঘড়ির মধ্যে পার্থক্য গণনা করে এটি কাটিয়ে উঠতে সক্ষম হয়েছি।

// For simplicity, don't worry about latency for now...
client_server_clock_delta = snapshot.server_timestamp - client_timestamp;

সত্তাটি কতটা দ্বিখণ্ডনের মধ্যে কতটা বরাবর রয়েছে তা নির্ধারণ করার সময়, আমি কেবল ক্লায়েন্টের বর্তমান সময়ের মধ্যে পার্থক্যটি যুক্ত করি। তবে এর সাথে সমস্যাটি হ'ল এটি হতাশার কারণ হবে কারণ অন্যগুলির চেয়ে তড়িঘড়ি / ধীরে ধীরে আগত স্ন্যাপশটের কারণে দুটি ঘড়ির মধ্যে পার্থক্য হঠাৎ করে ওঠানামা করবে।

আমি কীভাবে ঘড়িগুলি ঘনিষ্ঠভাবে সংহত করতে পারি যে একমাত্র অনুধাবনযোগ্য বিলম্ব হ'ল যা অন্তরঙ্গকরণের জন্য হার্ড-কোডড এবং সাধারণ নেটওয়ার্কের বিলম্বিত কারণে ঘটে?

অন্য কথায়, ঘড়িরগুলি হতাশার পরিচয় না দিয়ে খুব বেশি দেরি বা খুব শীঘ্রই শুরু হওয়া থেকে আমি কীভাবে প্রবৃত্তিকে আটকাতে পারি?

সম্পাদনা: উইকিপিডিয়া অনুসারে , এনটিপিকে কয়েক মিলি সেকেন্ডের মধ্যে ইন্টারনেটের মাধ্যমে ঘড়িগুলি সিঙ্ক্রোনাইজ করতে ব্যবহার করা যেতে পারে। তবে, প্রোটোকলটি জটিল বলে মনে হচ্ছে এবং সম্ভবত গেমগুলিতে ব্যবহারের জন্য ওভারকিল রয়েছে?


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

@ratchetfreak: ( খনি- নিয়ন্ত্রণ নিয়ন্ত্রণ / জ্যাক / টাইমসিএনসি / টাইমসিএনএইচটিএমএল ) অনুসারে , "দুর্ভাগ্যক্রমে, এনটিপি খুব জটিল এবং আরও গুরুত্বপূর্ণ, সঠিক সময় ব- দ্বীপে রূপান্তর করতে ধীর। এটি এনটিপিকে নেটওয়ার্কের জন্য আদর্শের চেয়ে কম আদর্শ করে তোলে গেম খেলুন যেখানে প্লেয়ার আশা করে যে গেমটি তাত্ক্ষণিকভাবে শুরু হবে ... "
জোনকম

উত্তর:


10

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

আমি একটি পদ্ধতি পাওয়া এখানে অবশ্য যা অপেক্ষাকৃত সহজ বলে মনে হয়:

এটি একে অপরের 150 মিমি (বা আরও ভাল) এর মধ্যে ঘড়িগুলি সিঙ্ক্রোনাইজ করার দাবি করে।

আমার উদ্দেশ্যগুলির জন্য এটি যথেষ্ট ভাল হবে কিনা আমি জানি না, তবে আমি এর থেকে আরও সুনির্দিষ্ট বিকল্পটি সন্ধান করতে পারিনি।

এটি প্রদান করা অ্যালগরিদম এখানে:

গেমসের জন্য একটি সাধারণ ক্লক সিঙ্ক্রোনাইজেশন কৌশল প্রয়োজন। আদর্শভাবে, এর নিম্নলিখিত বৈশিষ্ট্য থাকতে হবে: যুক্তিসঙ্গতভাবে নির্ভুল (150 মিমি বা আরও ভাল), রূপান্তরিত করতে দ্রুত, বাস্তবায়নে সহজ, টিসিপির মতো স্ট্রিম-ভিত্তিক প্রোটোকল চালাতে সক্ষম।

এই বৈশিষ্ট্যগুলির সাথে একটি সাধারণ অ্যালগরিদম নিম্নরূপ:

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

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

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


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

@dynamokaj মোটামুটি ভাল কাজ করে।
জনকম

কুল। আপনি কি বাস্তবায়ন ভাগ করে নিতে পারবেন?
ডায়নামোকাজ

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

সমস্যা নেই. আমি গুগল অ্যাপ ইঞ্জিনে আমার ব্যাকএন্ড পরিষেবাটি চালিয়ে যাচ্ছি, অতএব গুগলস অবকাঠামোতে যেখানে সার্ভারগুলি গুগল এনটিপি সার্ভার ব্যবহার করে সিঙ্ক্রোনাইজ করা হয়: টাইম জিওএল ডটকম ( ডেভেলপার্স.কম / টাইম ) তাই আমি আমার জ্যামারিন মোবাইল ক্লায়েন্টের জন্য নিম্নলিখিত এনটিপি ক্লায়েন্ট ব্যবহার করি ক্লায়েন্ট এবং সার্ভারের মধ্যে অফসেট পেতে। घटक. xamarin.com/view/rebex-টাইম - উত্তর দেওয়ার জন্য সময় দেওয়ার জন্য ধন্যবাদ।
ডিনামোকাজ

1

মূলত, আপনি [পুরো] বিশ্ব ঠিক করতে পারবেন না এবং শেষ পর্যন্ত আপনাকে লাইনটি আঁকতে হবে।

যদি সার্ভার এবং সমস্ত ক্লায়েন্ট একই ফ্রেম-হার ভাগ করে নেয় তবে তাদের কেবল সংযোগের সময় এবং মাঝে মাঝে বিশেষত একটি বিলম্বিত ইভেন্টের পরে সংযোগ স্থাপন করা দরকার। লেটেন্সি সময়ের প্রবাহ বা এটির পরিমাপ করার পিসির ক্ষমতাকে প্রভাবিত করে না, অনেক ক্ষেত্রে ইন্টারপোলেটের পরিবর্তে আপনাকে অবশ্যই এক্সট্রোপোলেট করতে হবে। এটি সমানভাবে অযাচিত প্রভাব তৈরি করে তবে আবার এটি হ'ল এবং আপনাকে অবশ্যই সমস্ত উপলভ্য কুফলগুলি বেছে নিতে হবে।

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

প্রযুক্তিগতভাবে, এটি আপনার গেমের নয়, প্লেয়ারের নেটওয়ার্ক অবকাঠামোতে সমস্যা। এটি এক থেকে অন্য দিকে যে বিন্দুতে যায় সেটি হ'ল আপনাকে আঁকতে হবে line 3 টি পৃথক কম্পিউটারে আপনার কোডে কমবেশি সময় অতিবাহিত হওয়া কম রেকর্ড করা উচিত। আপনি যদি কোনও আপডেট না পান তবে এটি আপনার আপডেট () ফ্রেম-হারকে প্রভাবিত করবে না; যদি কিছু হয় তবে এটি দ্রুত হওয়া উচিত যেহেতু আপডেট করার সম্ভাবনা কম রয়েছে।

"আপনার যদি ক্রম্পি ইন্টারনেট থাকে তবে আপনি এই গেমটি প্রতিযোগিতামূলকভাবে খেলতে পারবেন না।"
এটি পাস-দ্য বাক্স বা বাগটি নয়।

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