মাল্টিপ্লেয়ার গেমের ইন্টারপোলটিং পজিশন


14

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

যখন আমি কোনও অবজেক্টের জন্য আপডেট বার্তা পাই তখন আমি পরবর্তী আপডেটটি আসার প্রত্যাশার সময়টি গণনা করি:

origin = serverCurrentPosition
diff = serverNextPosition - origin
arriveTime = now + timeBetweenTicks * updateRate

আমি যখন অবজেক্টটি আঁকি তখন আমি পরবর্তী আপডেট পর্যন্ত অবশিষ্ট সময়টি গণনা করি এবং সেই অনুযায়ী অবস্থানটি বিভক্ত করি:

step = 100 / timeBetweenTicks * updateRate
delta = 1 - step * ((arriveTime - now) / 100)
position = origin + diff * delta

এটি কাজ করে ... তবে অঙ্কনটিতে এখনও কিছুটা বিড়বিড় রয়েছে, যদিও আমার তত্ত্ব অনুসারে প্রতিটি জিনিসই ঠিকঠাকভাবে কাজ করা উচিত, যেহেতু স্কেলিংটি কিছুটা পিছনে রাখা উচিত, তাই না?

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


হাই আইভো আমি মনে করি এটি একটি ভাল বিষয়, তবে এটি আপনার কোডটি কী করছে তা স্পষ্ট নয় - উদাহরণস্বরূপ সার্ভারকন্টার পজিশন, সার্ভারনেক্সটপজিশন, টাইমবিটুইনটিক্স কোথা থেকে আসে?
সিসকোআইফোন

এটি সার্ভার থেকে আসা আপডেট ডেটাতে প্রেরণ।
আইভো ওয়েটজেল

উত্তর:


11

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

সুতরাং, আপনি যখন নির্দিষ্ট সময়ে আপডেটটি পাওয়ার উপর নির্ভর করেন তখন আপনি আসল আপডেটের সামান্য আগে / পরে অবিচ্ছিন্নভাবে গন্তব্যে পৌঁছে যান। অতএব, বিড়ম্বনা।

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

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


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

এটা বেশ সম্ভব। যদি ত্বরণ চালু করা ফ্রেম হারকে উচ্চতর করে তোলে, তবে ঠিক সঠিক মুহূর্তে আপডেটের তথ্য পরিচালনা করার সম্ভাবনা বৃদ্ধি পায় increases
কিছু মনে রাখবেন না

9

আমি "নেটওয়ার্কের ছায়া" কল করে এমন একটি পদ্ধতির সাথে কিছু সাফল্যের সাথে এই সমস্যাটি সমাধান করেছি। আমি জানি না এটি অন্য লোকেরা কিছু করে তবে এটি আমার পক্ষে সর্বদা কাজ করে।

প্রতিটি সত্তা যা পুরো নেটওয়ার্ক জুড়ে সিঙ্ক্রোনাইজ করা হচ্ছে তার অদৃশ্য নেটওয়ার্ক শ্যাডো সত্তা রয়েছে। নেটওয়ার্ক থেকে কোনও আপডেট এলে আপনি ছায়াটিকে সরাসরি সেই অবস্থানের টেলিপোর্ট করবেন যা নেটওয়ার্ক বলে যে এটি হওয়া উচিত, তখন আপনি আস্তে আস্তে স্থানীয় দৃশ্যমান সত্তাকে সময়ের সাথে ছায়ার দিকে বিচ্ছিন্ন করে দিন।

আমি এখানে আমার পূর্ববর্তী উত্তরে এই পদ্ধতির সম্পর্কে প্রচুর বিবরণ অন্তর্ভুক্ত করেছি


এইচএম, আমি এর আগের সংস্করণে এরকম কিছু করেছি, ভাসমান পয়েন্টের অসম্পূর্ণতা সময়ে সময়ে এটি সত্যই খারাপ করে দেয়, আমার কাছে বেশ কয়েকটি বড় টাইমস্প্যান রয়েছে কিছু আইটেমের জন্য 300 মাইল অবধি আপডেটগুলি, তবে আমি কেবল এটি ভুল করেছি, আমি এটি দিতে যাচ্ছি আমি যখন কিছু ফ্রি সময় পাই তখন একটি শট :)
Ivo Wetzel

ভাসমান পয়েন্ট নির্ভুলতা সত্যই এটিকে আসা উচিত নয়! আপনি স্ট্যাকওভারফ্লোতে আমার সংযুক্ত উত্তরটি পড়েছেন? এটি এই ধরণের জিনিস বাস্তবায়নের সমস্ত বিবরণ কভার করে।
মার্টিন

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