স্থানীয় ইনপুট পূর্বাভাসের কারণে প্লেয়ারটি থামার পরে আমি কীভাবে তাকে বাড়া থেকে আটকাতে পারি?


14

আমি একটি 2 ডি সার্ভার-ক্লায়েন্ট মাল্টিপ্লেয়ার গেম ইঞ্জিনে কাজ করছি (যা আপনি এখানে চেষ্টা করতে পারেন )। এটি ওয়েবআরটিটিস ব্যবহার করে DataChannel। (সংযোগগুলি পিয়ার-টু-পিয়ার হয় তবে হোস্ট পিয়ার এখনও সার্ভার হিসাবে কাজ করে)

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

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

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

আমি অন্যান্য গেমগুলিতে এটি লক্ষ্য করেছি না। কীভাবে এটিকে প্রশমিত করা যায়?


3
একটি P2P খেলা যা একটি সার্ভার আছে? এখানে কিছু ভুল আছে।
এপিআই-বিস্ট

ওফস, 'সার্ভার' দ্বারা আমি 'হোস্ট পিয়ার' বলতে চাইছি।
অ্যাশলেব্রাইন

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

আহ ... এটি আসলে একটি ভাল পয়েন্ট ... আমি মিশ্রিত হয়েছি: সংযোগগুলি পিয়ার-টু-পিয়ার (যা ওয়েবআরটিসিটি যা করে), কিন্তু ইঞ্জিনটি নিজেই সার্ভার-ক্লায়েন্ট (পিয়ারগুলির মধ্যে একটি মাত্র সার্ভার )। ভাল যুক্তি.
অ্যাশলেব্রাইন

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

উত্তর:


8

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

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

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

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

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

সার্ভারের ইনপুট ঘড়িগুলি যাচাই করতে হবে এবং নিশ্চিত করা উচিত যে প্রতারণা রোধ করতে তারা খুব বেশি প্রত্যাশা থেকে প্রবাহিত হচ্ছে না। আপনার গণনা করা হওয়া অর্ধ-রাউন্ড-ট্রিপ সময়ের চেয়ে ইনপুট ঘড়িটি খুব বড় হওয়া উচিত নয়। যুক্তিসঙ্গত পরিসরের যে কোনওটিকে ক্ল্যাম্প করুন ( [Now-2*RTT,Now]উদাহরণস্বরূপ)।

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


1

আমি অবস্থান সংশোধনের জন্য বাটন স্থিতির পরিবর্তন এবং অবিশ্বাস্য ইউডিপি বার্তাগুলি নির্দেশ করতে নির্ভরযোগ্য ইউডিপি বার্তা ব্যবহার করেছি। বেসিক্যালি, নিম্নলিখিত নিবন্ধগুলি আমাকে খুব সাহায্য করেছে: https://developer.valvesoftware.com/wiki/Source_M মাল্টিপ্লেয়ার_ নেটওয়ার্কিং

এটি প্রায় 20 বা 30 রাজ্যের সাশ্রয়ের জন্য অবস্থান সংশোধন বার্তার আগমন অনুসারে স্থির সময়ের ব্যবধানে প্লেয়ার স্টেটস সংরক্ষণ করে আন্দোলনের পূর্বাভাস সম্পর্কে বলেছে। সুতরাং দেখে মনে হচ্ছে আপনার দূরবর্তী খেলোয়াড়গণ নিয়মিতভাবে ভবিষ্যদ্বাণী কৌশল প্রয়োগ করে একটি "অতীত" বাস্তবের মধ্যে বাস করবেন :) নেট বার্তার প্রচ্ছন্নতার ভিত্তিতে আপনি ঠিক সময়ে হোস্টের কাছ থেকে বার্তা প্রেরণের সময় আপনার অবজেক্টের অবস্থান প্রায় পেতে পারেন।

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

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

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

আমি আমার প্রকল্পে ব্যবহৃত পুরো স্কিমটি বর্ণনা করেছি তাই আমি আশা করি আপনি আপনার প্রশ্নের উত্তর খুঁজে পাবেন।

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