Mahan Profile picture
Jun 18 17 tweets 5 min read Twitter logo Read on Twitter
#برنامه‌نویسی #ریتوییت
🔴 بازی‌های آنلاین چجوری کار می‌کنن و با چه روش‌هایی مشکلات تاخیر بین بازیکنان رو رفع می‌کنن؟
تو بازی‌های آنلاین همیشه فرض بر این گرفته می‌شه که پلیر‌ها قراره تقلب کنن‌ پس معمولا همه محاسبات... Image
مهم مثل جون و موقعیت مکانی پلیر‌ها باید تو سرور نگهداری بشن و با هر حرکتی آپدیت شده و به همه کاربرا منتقل بشن.
این سیستم برای بازی‌های نوبتی مثل شطرنج کار‌ می‌کنه ولی برای بازی‌های پر سرعت مثل csgo و dota مناسب نیست... Image
به عنوان مثال اگه شما بخواید با یه فردی که تو نیوریورک زندگی می‌کنه بازی کنید پینگ در «بهترین حالت» نزدیک به 100ms که از زمان فشار دادن کلید تا پایان انیمیشن کاراکتر 200ms یا حدود 12 فریم تفاوت ایجاد می‌شه. Image
برای رفع این مشکل از پیشبینی سمت کلاینت استفاده می‌کنیم به شکلی که کلاینت با فشار دادن هر کلید همزمان با ارسال حرکتش به سرور، جا‌بجا میشه و انیمیشن خودشو پلی می‌کنه. در اینجا سرور نقش ناظر رو پیدا می‌کنه و فقط در صورت تقلب یا ایجاد ناهماهنگی بازیکن رو به جای قبلیش بر‌ می‌گرونه.
این روش‌هم مشکل ناهماهنگیه رو ایجاد می‌کنه. اگه پلیر یه کلید رو دوبار پشت سر هم فشار بده به عنوان مثال تو 200ms حرکتش رو انجام می‌ده و بازی انیمیشن رو پلی می‌کنه. Image
اما اگه تاخیر سرور یه لحظه بشتر بشه از دید سرور پلیر هنوز کلید دوم رو فشار نداده پس 100ms عقب کشیده می‌شه و بعد از مدتی دوباره سر جای قبلیش بر‌ می‌گرده که قابل بازی نیست.
این مشکل به این علت به وجود میاد که پلیر بازی رو تو زمان حال می‌بینه ولی سرور به دلیل تاخیر زمان گذشته رو می‌بینه. برای رفع مشکل ناهماهنگی میشه یه عدد هم همراه با بقیه اطلاعات به سرور ارسال کرد که با استفاده از اون بتونه تصمیم بگیره بازیکن رو جابجا کنه یه سر جای خودش نگه داره. Image
تا اینجا ارتباط بین سرور و یه پلیر بود. در بیشتر بازی‌ها ولی چندین پلیر‌ با سرعت بالا حرکت می‌کنن و حرکات مختلفی رو ارسال می‌کنن که باعث میشه پهنای باند و cpu سرور بیش از حد مشغول بشه.
یه راهکار می‌تونه بافر کردن حرکات باشه. با این کار سرور همه حرکات رو تو یه صف قرار میده و هر 100ms همه حرکات رو اعمال می‌کنه.
از دید یک کاربر این حرکت مشکلات رو رفع می‌کنه ولی چون اطلاعات کاربر از پلیر‌های دیگه با تاخیر به دستش می‌رسه حرکاتشون غیر طبیعی و تیکه تیکه است. بسته به نوع بازی این روش می‌تونه جوابگو باشه. Image
بازی‌های مسابقه ای برای رفع این مشکل از روش dead reckoning استفاده می‌کنن تو این روش بر اساس سرعت و جهت حرکت پلیر‌های دیگه میشه حدث زد که تو اینده قراره کجا باشند و با این اطلاعات میشه کاری کرد که بازیکن‌، پلیر‌های دیگه رو به صورت طبیعی بیبینه.
این روش مشکل رو برای بازی‌های مسابقه‌ای حل می‌کنه ولی بازی های شوتر که امکان تخمین حرکات پلیر غیر ممکنه باید از روش دیگه‌ای استفاده بشه. Image
در اینجا باید محل بازکن‌های دیگه رو کلاینت متناسب با محل خودش محاسبه کنه. به عنوان مثال: در ثانیه 1000 محل بازیکن رو دریافت می‌کنی. با توجه به این که محل پلیر در ثانیه 900 رو هم داریم از ثانیه 1000 تا 1100 حرکتی که پلیر 100ms قبل انجام داده رو به کاربر نشون می‌دیم
تو این حالت کلاینت بازیکن‌های دیگه رو 100ms با تاخیر می‌بینه. و با تغییر زمان بندی‌ها، میشه پیشبینی‌ها با حرکت واقعی کاربران کمترین فاصله رو داشته باشه.
تا اینجا میشه تقریبا یه بازی، با سرعت معقول داشت که قابل بازی کردن ولی بعضی بازی‌های بسیار سریع که دقت بالایی زیادی لازم دارند مثل cod و یا cs ، ممکنه تأخیرها هنوز حس بشه.
زمانی که کلیک می‌کنید زمان و محل دقیق موقعیت شلیک به سرور ارسال میشه. اینجا سرور می‌دونه که آیا در زمان شلیک کسی در محدوده شلیک بوده یا نه و حتی بر خلاف دید بازیکنان بگه که آیا تیر برخورد کرده یا نه. این حرکت تمام مشکلات رو برطرف می‌کنه به جز اینکه شما بلد نیستید خوب بازی کنید🙂

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Mahan

Mahan Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us on Twitter!

:(