ক্লায়েন্ট-পার্শ্ব পূর্বাভাস কিভাবে কাজ করে?


33

আমি গুগল থেকে ভালভ + গাফেরন এবং শত শত পৃষ্ঠা পড়েছি তবে যে কোনও কারণেই আমি ক্লায়েন্টের ভবিষ্যদ্বাণী সম্পর্কে আমার মাথা পেতে পারি না।

আমার বোঝার জন্য, মূল সমস্যাটি হ'ল:

  • ক্লায়েন্ট এ এতে ইনপুট প্রেরণ করে T0
  • সার্ভার এ ইনপুট গ্রহণ করে T1
  • সমস্ত ক্লায়েন্ট এ পরিবর্তন পান T2

T2অবশ্য ক্লায়েন্ট ভবিষ্যদ্বাণী ব্যবহার করে, ক্লায়েন্ট একটি এখন একটি অবস্থান উপযুক্ত এ T4

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

উত্তর:


35

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

বিশেষ করে, ক্লায়েন্ট-সাইড ভবিষ্যদ্বাণী সম্পর্কে নিবন্ধ এই এক


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

5
@ ওরম্পার - অবশেষে আমি চতুর্থ নিবন্ধটি লিখেছি! gabrielgambetta.com/fpm4.html
ggambett

আপনার নিবন্ধের সিরিজের জন্য কুডোস :-) খুব সহায়ক, ধন্যবাদ :-)
অথবা ম্যাপার

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

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

4

আমি আসলে এটি বাস্তবায়ন করি নি (তাই কিছু সমস্যা হতে পারে যা আমি অবিলম্বে দেখছি না), তবে আমি ভেবেছিলাম আমি সাহায্য করার চেষ্টা করব।

আপনি যা বলেছিলেন তা এখানেই:

ক্লায়েন্ট এ টি-তে ইনপুট প্রেরণ করে

সার্ভার টি 1 এ ইনপুট গ্রহণ করে

সমস্ত ক্লায়েন্ট টি 2 এ পরিবর্তনটি গ্রহণ করে

T2 তে তবে ক্লায়েন্টের ভবিষ্যদ্বাণী ব্যবহার করে ক্লায়েন্ট এ এখন টি 4-এর উপযুক্ত অবস্থানে রয়েছে।

এটি সম্ভবত সার্ভার সময়ের নিরিখে বিবেচনা করা কার্যকর হবে। এটি (সম্ভবত) ইন্টারপোলেশন কীভাবে কাজ করে তার সাথে খুব মিল ।

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

এছাড়াও, ক্লায়েন্ট সর্বদা "অতীতে" রেন্ডার করে। সুতরাং আপনি ধরে নিয়েছেন যে ক্লায়েন্টটি দেখেছে বিশ্বটি হ'ল, বলুন, সার্ভারের সময়টি সত্যিকারের সময়ের চেয়ে 100 মাইল পিছনে।

সুতরাং আসুন সার্ভার সময় (এস দ্বারা মনোনীত) দিয়ে আপনার উদাহরণ পুনরায় লিখুন।

ক্লায়েন্ট সার্ভার সময় এস 0 এর সাথে T0 এ ইনপুট প্রেরণ করে (যা আমি অনুমান করছি সত্যই "সার্ভারের সময় বিয়োগের বিরতির সময় ক্লায়েন্টের উপস্থাপনা")। ক্লায়েন্ট সার্ভার থেকে প্রতিক্রিয়া জন্য অপেক্ষা না এবং অবিলম্বে সরানো।

সার্ভার টি 1 এ ইনপুট গ্রহণ করে। সার্ভার ক্লায়েন্ট কর্তৃক প্রদত্ত সার্ভার সময় S0- র ক্লায়েন্টের অনুমোদনের অবস্থান নির্ধারণ করে। এটি ক্লায়েন্টকে প্রেরণ করে।

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

যদি পূর্বাভাসিত অবস্থান / গতি / সার্ভারটি এস 0 তে যা কিছু ফেরত পাঠায় তা ক্লায়েন্ট এস -0 এ সঞ্চয় করে রাখার চেয়ে আলাদা হয়, ক্লায়েন্টটি কোনওভাবে এটি পরিচালনা করে। হয় খেলোয়াড়কে তাদের অতীত অবস্থানে ফিরে গিয়ে, বা পূর্ববর্তী ইনপুটটিকে পুনরায় আকার দিয়ে, বা অন্য কোনও কিছু যা আমি ভেবে দেখিনি।


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

2

আসলে গিথুবে একটি ওপেন-সোর্স বাস্তবায়ন রয়েছে যা দেখায় যে এটি কীভাবে হয়। Lance.gg দেখুন Check

গিথুব রেপো: https://github.com/lance-gg/lance

ক্লায়েন্টের পূর্বাভাস কোডটি মডিউলটিতে প্রয়োগ করা হয় src/syncStrategies/ExtrapolateStrategy.js

এক্সট্রাপোলেশন ছাড়াও দুটি ধারণা রয়েছে যা আমি উপরে বর্ণিত দেখিনি:

  1. বর্ধিত নমন মূলত সার্ভার সংশোধন একবারে প্রয়োগ করার পরিবর্তে আপনি বদ্বীপটি ছোট বর্ধিত ক্ষেত্রে প্রয়োগ করতে দেন। এইভাবে দূরবর্তী বস্তুগুলি সার্ভারের অবস্থানগুলির সাথে মেলে ধীরে ধীরে তাদের অবস্থানগুলি সামঞ্জস্য করবে। অবস্থান নমন, বেগ নমন, কোণ নমন, এবং কৌণিক বেগ নমন আছে। এছাড়াও আপনি বিভিন্ন বস্তুর জন্য বিভিন্ন নমনকারী উপাদানগুলি চাইতে পারেন।
  2. পদক্ষেপ পুনঃনির্ধারণ। ডেটা অতীতে ছিল এর অর্থ আপনি সার্ভার ডেটা টাইমে সময় রোলব্যাক করতে পারেন এবং সেই বিন্দু থেকে পুনরায় চালু করতে পারেন। অবশ্যই আপনাকে এখনও এটিতে লাফিয়ে না গিয়ে নতুন-সন্ধানী অবস্থানের দিকে বাঁকানো দরকার।

1

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

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

ভালভ নিবন্ধের নীচে কিছু অতিরিক্ত লিঙ্ক রয়েছে যা পড়ার মতো are এটির মধ্যে একটি: https://developer.valvesoftware.com/wiki/Prediction


সুতরাং, আমি কি ভেবেছি যে ক্লায়েন্ট (এ t=4) সম্পর্কে তথ্য পেয়েছে t=2, তাই এটি পুনরায় সেট করে রাষ্ট্রটিকে t=2পুনরায় চালিত করে অবজেক্টগুলি এনে আনার t=2জন্য t=4?
জর্জ ডেকেট

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

@ জর্জিডুকেট: হ্যাঁ (যদিও এটি টি = ৪ হতে হবে না, যখনই কোনও তাত্পর্য সনাক্ত করা যায় তখনই এটি হতে পারে এবং পুনরায় প্রয়োগ হওয়া
অনেকগুলি আপডেটও

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