মাল্টিপ্লেয়ার প্ল্যাটফর্মার - সাধারণত সার্ভারের একক ক্লায়েন্টের সাথে কি সার্ভার সংশোধন করা দরকার?


10

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

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

আপনি যদি গেম নেটওয়ার্কিংয়ের সাথে পরিচিত হন তবে আমি মনে করি আপনি প্রাসঙ্গিক বিভাগগুলি এড়িয়ে যেতে পারেন, যদিও আমি পাশাপাশি কিছুটা ভুল করেছি।

ক্লায়েন্ট লুপ (প্রতি ফ্রেমে একবার, প্রতি ~ 16.67ms একবার)

সরলীকৃত ক্লায়েন্টের লুপটি দেখতে:

  1. স্থানীয় ইনপুট (ডাব্লুএএসডি) পরীক্ষা করুন এবং তাদের ক্রিয়া হিসাবে প্যাকেজ করুন (যেমন Type=MoveLeft, Time=132.0902, ID=15)। আমরা প্যাকেজযুক্ত ক্রিয়াগুলি শেষ পর্যন্ত সেগুলি প্রেরণে রাখি। এছাড়াও, আমরা গেমের স্থানীয় পদার্থবিজ্ঞানের সিমুলেশনটিতে সরাসরি কাঙ্ক্ষিত ক্রিয়াটি প্রয়োগ করি। উদাহরণস্বরূপ, আমাদের যদি MoveLeftঅ্যাকশন থাকে তবে আমরা খেলোয়াড়ের বেগের বাম দিকে একটি শক্তি প্রয়োগ করি।

  2. ক্রিয়া প্রেরণ করতে চেক করুন। ক্লায়েন্টের ব্যান্ডউইথের অপব্যবহার থেকে রক্ষা পেতে কেবল নির্দিষ্ট বিরতিতে প্যাকেজযুক্ত ক্রিয়াগুলি (যেমন 30 মিমি) প্রেরণ করুন।

  3. সার্ভার পরিবর্তনগুলি প্রয়োগ করুন। একটি নির্দিষ্ট সময়ে এটি সার্ভারের দ্বারা প্রাপ্ত ডেল্টাস এবং সংশোধনগুলি পরিচালনা করবে এবং এটিকে স্থানীয় স্থানীয় সিমুলেশনে প্রয়োগ করবে apply এই নির্দিষ্ট প্রশ্নের জন্য, এটি ব্যবহার করা হয় না।

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

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

সার্ভার লুপ (প্রতি 15 মিমি)

সরলিকৃত সার্ভার লুপটি দেখতে:

  1. ক্রিয়াকলাপ পরিচালনা করুন। ক্লায়েন্টদের কাছ থেকে প্রাপ্ত ক্রিয়া প্যাকেজগুলির জন্য চেক করুন এবং সেগুলি সার্ভার ফিজিক্স সিমুলেশনে প্রয়োগ করুন। উদাহরণস্বরূপ, আমরা 5 টি MoveLeftক্রিয়া পেতে পারি এবং আমরা গতিবেগে 5 বার বল প্রয়োগ করবএটি লক্ষণীয় গুরুত্বপূর্ণ, ক্লায়েন্টের বিপরীতে যেখানে ক্রিয়া সংঘটিত হওয়ার সাথে সাথে এটি প্রয়োগ করা হয় সেখানে একটি সম্পূর্ণ ফ্রেম প্যাকেজ একটি "ফ্রেমে" সম্পাদন করা হয়।

  2. গেমটির যুক্তি আপডেট করুন। আমরা গেম ফিজিক্স, চলমান প্লেয়ার এবং ফিক্সিং সংঘর্ষগুলি ইত্যাদি আপডেট করি etc. পরে আমরা খেলোয়াড়দের কাছে প্রেরণের জন্য ঘটে যাওয়া কোনও গুরুত্বপূর্ণ ইভেন্টও প্যাকেজ করি (যেমন কোনও খেলোয়াড়ের স্বাস্থ্য হ্রাস পেয়েছে, একজন খেলোয়াড় মারা গিয়েছিল)

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

সমস্যাটি

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

সিঙ্কটি সাধারণ সংঘর্ষ / চলাচলের সাথে দুর্দান্ত কাজ করে

প্রোটোটাইপ গ্রাফিক্স উপেক্ষা করুন। সাদা আয়তক্ষেত্র = প্লেয়ার, লাল আয়তক্ষেত্র = প্রতিবন্ধকতা, নীল = ব্যাকগ্রাউন্ড

তবে সময় সংবেদনশীল চলাফেরা করার পরে আমি সিঙ্ক ত্রুটিগুলি পাচ্ছি, যেমন ঝাঁপিয়ে পড়া এবং কোনও বিচ্ছিন্ন বাধার কাছে চলে যাওয়ার মতো:

সিঙ্কটি কাজ করে না কারণ সময় সংবেদনশীল মুহুর্তগুলিতে আমি নির্দিষ্ট বাধা পেরিয়ে এসেছি

তত্ত্বগতভাবে, আমি উভয়ই সর্বদা একই ফলাফলের সমাপ্তি আশা করব, কারণ ক্লায়েন্টের তার অবস্থানকে প্রভাবিত করার কোনও বাহ্যিক কারণ নেই। বাস্তবে, যদিও আমি মনে করি আমি সমস্যাটি বুঝতে পারি।

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

প্রশ্নটি

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

আমি কিছু সম্ভাব্য সমাধানের কথা ভেবেছি, যার মধ্যে আমি কম স্বাচ্ছন্দ্য বোধ করছি:

  1. সার্ভার সংশোধন কার্যকর করুন। কেবল ধরে নিন যে এগুলি স্বাভাবিক আচরণ এবং ত্রুটিগুলি হবার সাথে সাথেই এটি সঠিক। আমি এটিকে যাইহোক বাস্তবায়ন করতে চেয়েছিলাম, তবে আমি কেবল এটি নিশ্চিত করতে চেয়েছিলাম যে আমি এখন পর্যন্ত যা করেছি তা গ্রহণযোগ্য।

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

  3. গেম ডেভেলপমেন্ট স্ট্যাক এক্সচেঞ্জকে একটি দুর্দান্ত নতুন আইডিয়া জিজ্ঞাসা করুন যা আমার সমস্ত সমস্যার সমাধান করবে।

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

আপনার মূল্যবান সময়ের জন্য আপনাকে অনেক ধন্যবাদ।


আপনার সার্ভার এবং ক্লায়েন্ট বিভিন্ন হারে ফ্রেম চালায়। ক্লায়েন্ট টানা ফ্রেমগুলিতে দুটি ক্রিয়া সম্পাদন করে তবে সার্ভারটি তাদের মধ্যে একটি-ফ্রেম ফাঁক দেখে কী ঘটে?
ব্যবহারকারী 253751

এই প্রভাবটি হ্রাস করার জন্য @ মিমিবিস নিজেকে গ্যাফারংএইমস / গেম - ফিজিক্স / ফিক্স- আপনার - টাইমস্টেপ থেকে ভিত্তি করে তৈরি করেছেন ।
জেসি এমন্ড 11

উত্তর:


11

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

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

স্থানীয় ক্লায়েন্টের উপর গেমটি প্রতিক্রিয়া বোধ করতে এবং দূরবর্তী ক্লায়েন্টদের জন্য মসৃণ দেখতে এই ধরণের কৌশলটি সংশোধন এবং সংযোগের সাথে একত্রে ব্যবহৃত হয়।


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

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

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