سلام میخواستم بدونم اگه کسی راجع به فرآیند های serialization و data encoding و delta compression تو بازی های multiplayer اطلاعاتی کامل و جامعی داره لطف کنه و توضیح بده یا اگه منبع کامل و جامعی میشناسه معرفی کنه.
بحث
کسی میتونه راجع به serialization و encoding داده ها در بازی های real time multiplayer توضیح بده؟
کسی میتونه راجع به serialization و encoding داده ها در بازی های real time multiplayer توضیح بده؟
من کجام؟ اینجا کجاست؟
در جامعه بازیسازان ایران میتونید در مورد هر موضوعی سوال کنید، به سوالای بقیه جواب بدید و تجربهتون رو به اشتراک بگذارید!
بازیهای Multiplayer به صورت عام، طبقه خیلی وسیعی هست و خودش به چند نوع جزئی تر تقسیم میشه که در هر کدام تکنیک مختلف است.
برای بازیهای LockStep که نرخ تبادل Input کم است (مثل کلش رویال) حتی شاید بتوان از Json که فرمت غیر بهینهای از نظر حجم است استفاده کرد. چون نرخ تبادل آنقدر کم است که قابل چشم پوشی است.
اما برای بازیهای Fast Paced مثل بازیهای FPS باید به صورت باینری encoding , decoding انجام بشه. که خب نیاز به یک پروتکل هست که بتوان باینری نوشت و خواند که معمولا هر بازی به دلیل جزئیات مخصوص خود، خود آن را توسعه میدهد. فرمتهای public و استانداردی البته جود دارند مثل Google Protocol Buffers اما به دلیل عمومی بودن فاقد بهینه سازیهایی هستند که مخصوص بازی شماست. هر چند Google Protocol Buffers از Json بسیار بهینه تر هست.
برای اینکه چه چیزی میتواند مثلا در بازی ما خاص باشد یک مثال میزنم: فرض کنید در بازی ما سرعت حرکت آبجکت ها رو مخابره می کنیم حال آنکه در 90 درصد مواقع آنها اصلا حرکتی نمی کنند. پس به جای ارسال 3 float ابتدا می توانیم یک بیت به عنوان حرکت داشتن یا نداشتن بفرستیم و در صورتی که حرکت نداشت از ارسال سرعت 0و0و0 خود داری کنیم. این مثال رو می توان تعمیم داد به دیگر موارد.
یا در مثالی دیگر می دانیم مقدار یک متغیر بیش از 10 بیت استفاده نمی کند ، پس می توانیم 10 بیت ارسال کنیم در صورتی که اگر متغیر مثلا short تعریف شده باشه ، اگر راه حل عمومی استفاده کنیم حداقل 16 بیت ارسال می شود.
مبحث نسبتا پیچیده و نیاز به مطالعه بیشتر دارد که در این نوشته نمی گنجد.
لینک زیر منبع بسیار خوبی هست و همچنین سایت پر از مقالات مفید از Game Networking هست:
https://gafferongames.com/post/serialization_strategies/
خیلی ممنون از توضیحاتتون، یک سوالی که برام پیش اومد شما منبع خاصی دارید که گفته کلش رویال به صورت lock step هست؟
نه منبعی ندارم ، البته lockstep هم فکر می کنم دقیقا درست نباشه برای کلش رویال چون منتظر تمام کلاینت ها نمیمونه برای پیش بردن منطق بازی.
منظورم این بود که کلش رویال Deterministic پیاده سازی شده ، لذا تنها به مبادله command ها می پردازه ( مثل spawn کردن هیروها توسط کارتها) و State Synchronization به شکل مداوم انجام نمیشه. اما به صورت lockstep کلاسیک نیست که منتظر تمام input ها بمونه و ادامه بده چون اصلا پلیرها هر فریم input ایی صادر نمی کنند.
برای مثال 30 بار در ثانیه در کلش رویال زمان تیک میخوره و منطق جلو میره. اگر کسی command ای بفرستد مثلا spawn کردن ، برای یک ثانیه بعد زمان بندی می شود ، زمانی که به سرور می رسد اگر از یک ثانیه بیشتر گذشته باشد ، command ریجکت میشه اگر نه accept میشه و به بقیه کلاینت ها هم مخابره میشه تا آنها هم در tick تعیین شده ، command را اجرا کنند.
حتما دیدید که وقتی ارتباط کند میشه ، یک سری از command های شما reject میشه.
من روی یک پروژه ای که کلون کلش رویال بود(هردمبیل) کار می کردم و این اطلاعات اونجا از بررسی نزدیک کلش رویال به دست اومد. هر چند به صورت black box دید داشتیم به کلش رویال و منبع رسمی برای صحبت هام ندارم.
با توجه به اینکه ما کلون رویال رو زدیم این قاطعیت رو دارم که عمده اطلاعاتی که بین سرور و کلاینت حین نبرد رد و بدل میشه نوع کارت، موقعیت و زمان پیاده سازی کارت هست. علی جان تقریبا درست میگه.