আমি বর্তমানে একটি বরং সাধারণ মাল্টিপ্লেয়ার প্ল্যাটফর্মার নিয়ে কাজ করছি। আমি লেটেন্সি আড়াল করার জন্য ব্যবহৃত কৌশলগুলি সম্পর্কে বেশ কয়েকটি নিবন্ধ পড়েছি, তবে এখনও কিছু ধারণা সম্পর্কে আমার মাথা পেতে ব্যর্থ। আমি বিষয়টিকে খুব আকর্ষণীয় বলে মনে করি এবং নিজের দ্বারা ধারণাগুলি চেষ্টা করতে চাই তবে আমার মনে হয় গেমদেব স্ট্যাকেক্সচেঞ্জ জিজ্ঞাসা করা আমার প্রশ্নের পক্ষে আরও দক্ষ হবে। আমি আমার বর্তমান পরিস্থিতি এবং পথে কী প্রশ্ন উত্থাপিত হয়েছে তা বর্ণনা করার জন্য যথাসাধ্য চেষ্টা করব।
এই মুহুর্তে, আমি কেবলমাত্র একটি একক প্লেয়ার সার্ভারের সাথে সিঙ্ক করতে চাই। তাত্ত্বিকভাবে, আমি ক্লায়েন্ট-সাইড প্রেডিকশন দিয়ে নিজের দ্বারা একজন খেলোয়াড়কে ধরে নিয়েছিলাম যে সার্ভার সংশোধনের প্রয়োজন হবে না, যেহেতু তার চলাফেরাকে প্রভাবিত করে এমন কোনও বাহ্যিক কারণ নেই। অতএব, আমার প্রোটোটাইপটিতে বর্তমানে কেবলমাত্র একজন খেলোয়াড় সার্ভার সংশোধন না করে সার্ভারের সাথে সিঙ্ক হয়েছে।
আপনি যদি গেম নেটওয়ার্কিংয়ের সাথে পরিচিত হন তবে আমি মনে করি আপনি প্রাসঙ্গিক বিভাগগুলি এড়িয়ে যেতে পারেন, যদিও আমি পাশাপাশি কিছুটা ভুল করেছি।
ক্লায়েন্ট লুপ (প্রতি ফ্রেমে একবার, প্রতি ~ 16.67ms একবার)
সরলীকৃত ক্লায়েন্টের লুপটি দেখতে:
স্থানীয় ইনপুট (ডাব্লুএএসডি) পরীক্ষা করুন এবং তাদের ক্রিয়া হিসাবে প্যাকেজ করুন (যেমন
Type=MoveLeft, Time=132.0902, ID=15
)। আমরা প্যাকেজযুক্ত ক্রিয়াগুলি শেষ পর্যন্ত সেগুলি প্রেরণে রাখি। এছাড়াও, আমরা গেমের স্থানীয় পদার্থবিজ্ঞানের সিমুলেশনটিতে সরাসরি কাঙ্ক্ষিত ক্রিয়াটি প্রয়োগ করি। উদাহরণস্বরূপ, আমাদের যদিMoveLeft
অ্যাকশন থাকে তবে আমরা খেলোয়াড়ের বেগের বাম দিকে একটি শক্তি প্রয়োগ করি।ক্রিয়া প্রেরণ করতে চেক করুন। ক্লায়েন্টের ব্যান্ডউইথের অপব্যবহার থেকে রক্ষা পেতে কেবল নির্দিষ্ট বিরতিতে প্যাকেজযুক্ত ক্রিয়াগুলি (যেমন 30 মিমি) প্রেরণ করুন।
সার্ভার পরিবর্তনগুলি প্রয়োগ করুন। একটি নির্দিষ্ট সময়ে এটি সার্ভারের দ্বারা প্রাপ্ত ডেল্টাস এবং সংশোধনগুলি পরিচালনা করবে এবং এটিকে স্থানীয় স্থানীয় সিমুলেশনে প্রয়োগ করবে apply এই নির্দিষ্ট প্রশ্নের জন্য, এটি ব্যবহার করা হয় না।
স্থানীয় পদার্থবিজ্ঞান আপডেট করুন। প্রধান প্লেয়ারে পদার্থবিজ্ঞানের লুপ চালান। মূলত, এটি প্লেয়ারের চলাচলের ক্লায়েন্ট-সাইড পূর্বাভাস দেয়। এটি প্লেয়ারের গতিতে মহাকর্ষ যুক্ত করে, প্লেয়ারের গতিবেগ তার অবস্থানের সাথে প্রয়োগ করে, পথে সংঘর্ষগুলি সংশোধন করে ইত্যাদি। আমার উল্লেখ করা উচিত যে পদার্থবিজ্ঞানের সিমুলেশন সর্বদা একটি নির্দিষ্ট ব-দ্বীপ সেকেন্ডের সাথে সম্পাদন করা হয় (রিয়েল ডেল্টা সেকেন্ডের উপর নির্ভর করে একাধিকবার বলা হয়) ।
আমি পদার্থবিজ্ঞান এবং অন্যান্য বিভাগগুলি সম্পর্কে কয়েকটি নির্দিষ্ট বিবরণ এড়িয়ে যাচ্ছি কারণ আমার মনে হয় যে এগুলি প্রশ্নের জন্য প্রয়োজনীয় নয়, তবে তারা যদি প্রশ্নের সাথে প্রাসঙ্গিক হয় তবে আমাকে নির্দ্বিধায় জানান।
সার্ভার লুপ (প্রতি 15 মিমি)
সরলিকৃত সার্ভার লুপটি দেখতে:
ক্রিয়াকলাপ পরিচালনা করুন। ক্লায়েন্টদের কাছ থেকে প্রাপ্ত ক্রিয়া প্যাকেজগুলির জন্য চেক করুন এবং সেগুলি সার্ভার ফিজিক্স সিমুলেশনে প্রয়োগ করুন। উদাহরণস্বরূপ, আমরা 5 টি
MoveLeft
ক্রিয়া পেতে পারি এবং আমরা গতিবেগে 5 বার বল প্রয়োগ করব । এটি লক্ষণীয় গুরুত্বপূর্ণ, ক্লায়েন্টের বিপরীতে যেখানে ক্রিয়া সংঘটিত হওয়ার সাথে সাথে এটি প্রয়োগ করা হয় সেখানে একটি সম্পূর্ণ ফ্রেম প্যাকেজ একটি "ফ্রেমে" সম্পাদন করা হয়।গেমটির যুক্তি আপডেট করুন। আমরা গেম ফিজিক্স, চলমান প্লেয়ার এবং ফিক্সিং সংঘর্ষগুলি ইত্যাদি আপডেট করি etc. পরে আমরা খেলোয়াড়দের কাছে প্রেরণের জন্য ঘটে যাওয়া কোনও গুরুত্বপূর্ণ ইভেন্টও প্যাকেজ করি (যেমন কোনও খেলোয়াড়ের স্বাস্থ্য হ্রাস পেয়েছে, একজন খেলোয়াড় মারা গিয়েছিল)
সংশোধন প্রেরণ করুন। আমরা নিয়মিতভাবে (উদাহরণস্বরূপ প্রতি 35 মাইল একবার) অন্য খেলোয়াড়দের (যেমন প্লেয়ারের অবস্থান, স্বাস্থ্য ইত্যাদি) ডেল্টাস প্রেরণ করি যদি তারা সম্প্রতি পরিবর্তিত হয়। এই অংশটি বর্তমানে প্রয়োগ করা হয়নি, কারণ আমি চাইছি যে কোনও একক প্লেয়ারের সিমুলেশন ক্লায়েন্ট এবং সার্ভারে সংশোধন ছাড়াই একই ফলাফল দেয়, যাতে ক্লায়েন্ট-সাইডের পূর্বাভাসটি ঠিক কাজ করে।
সমস্যাটি
বর্তমান সিস্টেমটি সাধারণ পরিস্থিতিতে সূক্ষ্মভাবে কাজ করে, এবং আমি আনন্দের সাথে অবাক হয়ে দেখলাম যে এটি সরল অনুভূমিক আন্দোলনের সাথে খুব অনুরূপ ফলাফল দিয়েছে (ভুলগুলি ভাসমান পয়েন্ট যথার্থ ত্রুটির কারণে হয়েছে), আমি বিশ্বাস করি:
প্রোটোটাইপ গ্রাফিক্স উপেক্ষা করুন। সাদা আয়তক্ষেত্র = প্লেয়ার, লাল আয়তক্ষেত্র = প্রতিবন্ধকতা, নীল = ব্যাকগ্রাউন্ড
তবে সময় সংবেদনশীল চলাফেরা করার পরে আমি সিঙ্ক ত্রুটিগুলি পাচ্ছি, যেমন ঝাঁপিয়ে পড়া এবং কোনও বিচ্ছিন্ন বাধার কাছে চলে যাওয়ার মতো:
তত্ত্বগতভাবে, আমি উভয়ই সর্বদা একই ফলাফলের সমাপ্তি আশা করব, কারণ ক্লায়েন্টের তার অবস্থানকে প্রভাবিত করার কোনও বাহ্যিক কারণ নেই। বাস্তবে, যদিও আমি মনে করি আমি সমস্যাটি বুঝতে পারি।
যেহেতু এই জাতীয় একটি বাধার চারপাশে জাম্পিং প্লেয়ারের সময়ের উপর নির্ভরশীল, কারণ যখন বেগটি পজিশনে প্রয়োগ করা হয় তখন তার ক্ষুদ্রতর পরিবর্তনের ফলাফলের উপর বিপর্যয় ঘটতে পারে (যেমন ক্লায়েন্টের সাথে সংঘর্ষ এড়াতে ঠিক সময়ে সরে যেতে পারে) প্রতিবন্ধকতা, যদিও পুরো ক্রিয়া প্যাকেজটি পরবর্তী সময়ে পাওয়ার সাথে সাথে সার্ভার এটি করবে এবং চূড়ান্ত ফলাফল পরিবর্তন করে অল্প সময়ের জন্য বাধাটিতে আটকে থাকবে)। ক্লায়েন্ট এবং সার্ভার কীভাবে এটি পরিচালনা করে তার মধ্যে পার্থক্যটি হ'ল মূলত ক্লায়েন্টটি ঘটে যাওয়ার সাথে সাথে তার সমস্ত ক্রিয়াকলাপ সম্পাদন করে, যখন সার্ভার সেগুলি গ্রহণ করার সাথে সাথে তাদের সমস্ত কাজ করে।
প্রশ্নটি
এই দীর্ঘ প্রসঙ্গটি অবশেষে আমার প্রশ্নের দিকে নিয়ে যায় ( এটি পড়ার জন্য আপনাকে ধন্যবাদ): সার্ভারের সাথে কেবলমাত্র একজন খেলোয়াড় সিঙ্কড থাকা সত্ত্বেও কি সার্ভার সংশোধন করা সাধারণ, নাকি সময় সংবেদনশীল পরিস্থিতিতে ডিসেনক্রোনাইজেশন এড়াতে আমার কিছু কৌশল ব্যবহার করা উচিত? ?
আমি কিছু সম্ভাব্য সমাধানের কথা ভেবেছি, যার মধ্যে আমি কম স্বাচ্ছন্দ্য বোধ করছি:
সার্ভার সংশোধন কার্যকর করুন। কেবল ধরে নিন যে এগুলি স্বাভাবিক আচরণ এবং ত্রুটিগুলি হবার সাথে সাথেই এটি সঠিক। আমি এটিকে যাইহোক বাস্তবায়ন করতে চেয়েছিলাম, তবে আমি কেবল এটি নিশ্চিত করতে চেয়েছিলাম যে আমি এখন পর্যন্ত যা করেছি তা গ্রহণযোগ্য।
পছন্দসই ক্রিয়াগুলি প্রয়োগ করতে প্রদত্ত ক্লায়েন্টের সময়টি ব্যবহার করুন। আমার ধারণা এই পিছনে ক্ষতিপূরণের অনুরূপ হবে, "সময়মতো ফিরে যেতে" এবং চলাচলের জন্য পরীক্ষা করা প্রয়োজন। সার্ভার সংশোধন প্রয়োগ করার মতো, সময় মতো ফিরে আসুন এবং তার পরে পরবর্তী ক্রিয়াগুলি পুনরায় প্রয়োগ করুন। আমি ধারণাটি সত্যিই অপছন্দ করি। এটি জটিল দেখায়, সম্পদে ব্যয়বহুল এবং ক্লায়েন্টের প্রদত্ত সময়কে বিশ্বাস করা প্রয়োজন (যদিও আমি সত্যই সময়টি তুলনামূলকভাবে বৈধ বলে মনে করি তা পরিকল্পনা করি)।
গেম ডেভেলপমেন্ট স্ট্যাক এক্সচেঞ্জকে একটি দুর্দান্ত নতুন আইডিয়া জিজ্ঞাসা করুন যা আমার সমস্ত সমস্যার সমাধান করবে।
আমি কেবল গেম নেটওয়ার্কিংয়ের জগতে শুরু করছি, সুতরাং দয়া করে উপরের যে কোনও ধারণাকে সংশোধন / সমালোচনা / অপমান করতে নির্দ্বিধায় অনুভব করুন বা ধারণা / সংস্থান দিন যা আমাকে ওয়ান্ডারফুল ওয়ার্ল্ড অফ ওয়ার্ল্ডে আমার যাত্রা পথে সহায়তা করতে পারে। আমাকে ক্ষমা করুন যদি আমি আমার উত্তর অন্য কোথাও জানতে পারতাম তবে আমি তাতে ব্যর্থ হয়েছি।
আপনার মূল্যবান সময়ের জন্য আপনাকে অনেক ধন্যবাদ।