রিয়েল টাইম এফপিএস গেমটিতে সার্ভারে কী পাঠাতে হবে?


23

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

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

http://www.gabrielgambetta.com/fpm_live.html

স্থির বিরতি পদ্ধতির অবস্থান পাঠানোর বিষয়ে কী। এটি সার্ভারে খুব কম বার্তা প্রেরণ করে। কিন্তু এটি প্রতিক্রিয়াও হ্রাস করে।

সুতরাং কোন উপায় ভাল?

উত্তর:


19

সহজ উত্তর: প্রতারণা বা সত্য যে না!

আপনি যদি অনলাইনে কিছু শ্যুটার খেলেন তবে সার্ভারের সাথে আপনার সংযোগটি খারাপ থাকলে আপনি সম্ভবত তথাকথিত "রাবার ব্যান্ডিং" এর অভিজ্ঞতা অর্জন করতে পারেন।

এটি আপনার ক্লায়েন্ট সময়ে সময়ে আপনার অবস্থান সংশোধন করে is

মূলত, উভয় পক্ষেই কী ঘটে:

  • সার্ভারটি আপনার চলাফেরাকে ট্র্যাক করবে এবং প্রত্যাশার মতো ক্লায়েন্টগুলিতে আপডেট পাঠাবে। এগুলি সর্বদা সম্পূর্ণ আপডেট হতে হবে না। প্রতিটি এক্স ফ্রেমের একটি সম্পূর্ণ আপডেট হতে পারে, অন্য সমস্ত ফ্রেম আপনি কেবল নতুন বেগের ভেক্টর প্রেরণ করেন (যদি কোনও পরিবর্তন থাকে)।

  • আপনার নিজস্ব ক্লায়েন্ট আপনাকে অবাধে সরানোর অনুমতি দেবে তবে সার্ভারের দেওয়া আপডেটগুলি আপনার অবস্থান সঠিক / সামঞ্জস্য করতে ব্যবহার করবে। আপনি ফ্রেম দ্বারা অবস্থান ফ্রেম আপডেট না করলেও এটি গেমটি প্রতিক্রিয়াশীল মনে করবে ensure

কিন্তু ইনপুট কীভাবে পরিচালনা করা হয়? আপনার ক্লায়েন্ট আপনার অবস্থানটি সার্ভারে প্রেরণ করবে "আমি সেখানে চলে এসেছি"। সার্ভারটি এই আপডেটটি যাচাই করবে (উদাহরণস্বরূপ, আপনি কি সেই দ্রুত সেখানে যেতে সক্ষম হবেন?) এবং যদি এটি বৈধ হয় তবে আপনাকে (বা আপনার আপডেট প্রত্যাখ্যান করবে, যার ফলে "রাবার ব্যান্ডিং" হবে)।

সুতরাং হ্যাঁ, আপনার স্থির বিরতি পদ্ধতির সম্ভবত কার্যকরভাবে কাজ হবে এবং যথেষ্ট হবে।

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


5
হ্যাঁ আমি বোতাম টিপতে এবং টিপতে পারি। তবে মাউস ইনপুট সম্পর্কে কী? এটি প্রতিনিয়ত পরিবর্তন হচ্ছে।
syloc

6
"পরিবর্তে, বোতাম টিপে গেলে একটি ইভেন্ট পাঠান এবং একবার বোতামটি প্রকাশিত হয়।" - সত্য, তবে "রিলিজ অন" ইভেন্টটি গেমসের নিয়মের উপর নির্ভর করে অবশেষে বাধ্য করা হয়েছে কিনা তা নিশ্চিত করার জন্য সেখানে যথাযথ চেক করা দরকার। উদাহরণস্বরূপ, রেইনবো সিক্স ভেগাস 2 মাল্টিপ্লেয়ারে, একজন খেলোয়াড় তার বন্দুক চালানো শুরু করতে পারে এবং একটি (দুর্ভাগ্যক্রমে সাধারণ) বাগের কারণে "গুলি চালানো বন্ধ করুন" বার্তাটি সফলভাবে সার্ভারে না পৌঁছায়। এই ফলাফলটি ম্যাচের বাকি অংশের জন্য অসীম লুপে থাকা বন্দুকের অডিওর ফলাফল। সাবধান থাকা মাত্র একটি উদাহরণ Just youtu.be/GOQIbLCy7m8?t=9m10s
মাইক

@ সাইলোক: কেবল এটি ক্লায়েন্টের পাশ দিয়ে পরিচালনা করুন এবং চলাচলটি বৈধ / সম্ভব কিনা তা সার্ভারকে নির্ধারণ করতে দিন (টেলিপোর্ট হ্যাক এবং এর মতো জিনিসগুলি রোধ করতে)।
মারিও

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

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

5

আপনি যদি ইতিমধ্যে না থাকেন তবে আমি আপনাকে এই দুটি গভীর তবে বোধগম্য নিবন্ধগুলি পড়ার পরামর্শ দিচ্ছি: https://developer.valvesoftware.com/wiki/Source_M মাল্টিপ্লেয়ার_ নেটওয়ার্কিং এবং http://fabiensanglard.net/quake3/network.php

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

প্যাকেট প্রেরণে একটি নির্দিষ্ট খরচ হয় এবং একটি নেটওয়ার্ক প্যাকেট সর্বাধিক আকার প্রায় 1.5 কেবি হয়। সুতরাং আপনার যদি আপনার সার্ভারে উদাহরণস্বরূপ 16 জন খেলোয়াড় থাকে, প্রতিটি ফ্রেম যখন আপনি কোনও খেলোয়াড়ের জন্য চলাফেরার গণনা করেন, নিষ্পাপ কোড প্রতিটি আন্দোলনের রেজোলিউশনের পরে প্রতিটি খেলোয়াড়কে একটি আপডেট প্যাকেট প্রেরণ করতে পারে, তাই 16 * 16 = 256 প্যাকেট। আপনার যদি 30 এর ফ্রেমরেট থাকে তবে তা 7680 প্যাকেট।

আরও ভাল পন্থা হ'ল ফ্রেমের প্রতিটি শুরুতে একটি বাফার তৈরি করা, এতে আপনার 16 গণনা করা অবস্থানের আপডেট আপডেট করা এবং তারপরে আপনার 16 খেলোয়াড়কে প্রেরণ করা।

আপনি এখন একই ফলাফলের জন্য সেকেন্ডে কেবল 480 প্যাকেট প্রেরণ করেন।

প্লেয়ার-টু-সার্ভারের ক্ষেত্রে, এর অর্থ কেবল একই প্যাকেটে সর্বাধিক ডেটা যেমন পাঠানো উচিত; অবস্থান দেখেছি, ক্রিয়াকলাপগুলি এই ফ্রেমটিকে ডেকে আনে এবং ততক্ষণ।

আপনার প্রশ্নের দ্বিতীয় অংশ সম্পর্কে - আমি ল্যাগ সংবেদনটি হ্রাস করতে যেভাবে বেছে নিয়েছি তা হ'ল প্রতিটি ফ্রেমের সার্ভারে এই তথ্যটি প্রেরণ করা:

  • প্লেয়ারের আসল বর্তমান অবস্থান (সার্ভারের পাশ এবং প্লেয়ারের দিকের অবস্থানগুলি খুব বেশি সংখ্যায় বিভক্ত নয় কিনা তা পরীক্ষা করার জন্য সার্ভার দ্বারা ব্যবহৃত হয়)।

  • 1 সেকেন্ডে আনুমানিক প্লেয়ারের অবস্থান: ক্লায়েন্ট দ্বারা গণনা করা হয়: প্লেয়ার যদি মাউসের দিক পরিবর্তন না করে এবং 1 সেকেন্ডের জন্য কীবোর্ডটিকে বর্তমান অবস্থায় রেখে দেয় তবে প্লেয়ারটি কোথায় থাকবে? (আমরা সংঘর্ষের বিষয়ে চিন্তা করি না) যদি প্লেয়ারটি চলমান না থাকে তবে 1 সেকেন্ডে তার আনুমানিক অবস্থানটি তার বর্তমান অবস্থান।

  • তিনি যে অবস্থানটি দেখছেন।

প্রতিবার সার্ভার এই তথ্যটি গ্রহণ করলে এটি ভবিষ্যতের অবস্থান এবং অবস্থানের অবস্থানটি আপডেট করে এবং প্লেয়ার সত্তা শেষ পর্যন্ত তার ভবিষ্যতের অবস্থানের দিকে চলে যায়।

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


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

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