مدیریت و همگام سازی state بازیکن ها در بازی های آنلاین

راستش قصد دارم ی بازی آنلاین درست کنم.

ی سوال واسم پیش اومده که فرض کنید بهرحال connection سرور و کلاینت ی ping ای داره.
ممکنه همین ping به ظاهر کم، تاثیر زیادی رو نتیجه بازی داشته باشه.

چطور بازی های دیگه این موضوع رو حل میکنن؟ تجربه چنین پروژه هارو داشتید؟

1 Likes

خب اول از همه اینکه از TCP استفاده نمیکنن چون handshake داره و یه سری داستانها و باعث میشه کندتر باشه. یعنی پینگی که شما حساب میکنید، توی هر ریکوئست چندبار تاثیر خودش رو میذاره. چون ریکوئستها یه رفت و برگشتی دارن (درمورد tcp handshake یه سرچ بزنید)
یا از UDP استفاده میکنن که ممکنه یه سری دیتاها توش lost بشه، ولی مهم نیست چون بعدا با ریکوئست بعدی، آپدیت میشه.
یا از websocket استفاده میکنن که درحقیقت یه کانکشن TCP هست که هیچوقت قطع نمیشه که برای ریکوئست بعدی بخوایم دوباره Syn/Ack/Fin انجام بدیم.

استفاده از سرور خوب که پینگ پایینی داشته باشه هم مسلما به پایین آوردن پینگ کمک میکنه. مثلا از pingperfect.com سرویس میگیرن که شنیدم بهترین پینگ رو داره بین ارائه دهنده‌های سرور.
البته اگه این بازی قراره توی ایران انجام بشه، از یه دیتاسنتری که توی تهران هست یه سرور بگیرید، تقریبا به همه‌جای ایران پینگش ۶-۷ میلی‌ثانیست. (نمیدونم چرا ولی تست کردم، پینگ شیراز به شیراز ۲۵میلی‌ثانیه بود. پینگ شیراز به تهران ۶میلی‌ثانیه :neutral_face:)

2 Likes

میشه دیتایی که نیاز به رد و بدل شدن هست رو حداقل کرد. یک تکنیک‌هایی هست میتونی بگردی.
یادمه Unity قدیما خیلی مشکل شبکه‌ای داشت و ۵-۶ پکیج برای شبکه کردن بازی استفاده کردم. حالا احتمالا بهتر شده باشه.

2 Likes

این سایت خوبیه بازی های io رو لیست کرده

1 Likes

واقعا میخوام بدونم بازی هایی مثل این چطور کار میکنن

آیا هر کسی که شلیک میکنه یا تغییر جهت میده اطلاعات به همه بازیکن های دیگه هم میره؟
اینطوری سنگین نمیشه اطلاعات هایی که رد و بدل میشه؟

با این که رو وبه ولی از web socket استفاده نمیکنه

بازی رو انجام ندادم ولی اصولا آره دیگه!
ممکنه از یه تکنیک‌هایی استفاده کنه برای محاسبه‌ی اینکه «با توجه به سرعت اینترنت، نرخ ریفرش اطلاعات رو بذار روی ۱۰ ریکوئست بر ثانیه»
یا شاید کلا نرخ ریفرش، روی یه عدد کم گذاشته بشه و توی هر ثانیه ۱۰۰۰ بار همدیگه رو آپدیت نکنن.

ممکنه از WebRTC استفاده کنه!
اینطوری حتی از websocket هم میتونه سریعتر باشه چون بازیکن‌ها مستقیم به هم وصل میشن و سروری وسط راهشون نیست (مگر اینکه پشت یه فایروالی باشن که جلوی کانکشن مستقیم رو بگیره اونوقت fallback بشه به websocket)

1 Likes

شلیک کردن یک سیگنال هست، موقعیت هم نسبی هست، توی لحظه قبل میدونی کجان و صرفا سیگنال اینکه دو واحد رفت به راست رو دریافت میکنی. شلیک هم همینطور، از موقعیت فلان که بود، شلیک کرد. بعد مسیر و سرنوشت این شلیک توی بازی هر کسی شبیه سازی و محاسبه میشه.
مثلا توی این بازیه که دادی سرعت و راه رفتن همیشه ثابته و فقط زاویه است. زاویه هم همون میمونه مگر اینکه عوض شه تا سیگنال بفرسته همه آپدیت کنند.

2 Likes

با همش موافقم بجز این یه تیکه.
چون drop شدن packetها توی بازی و کلا هرچیز stream دیگه‌ای زیاد اتفاق میفته، نمیشه موقعیت رو همیشه نسبی اعلام کرد. باید absolute باشه که بتونه drop رو فیکس کنه.

2 Likes

عاشق این انجمنم

1 Likes