سفارش تبلیغ
صبا ویژن

راهنمای مبتدیان برای سرور گیمینگ در شیراز

راهنمای مبتدیان برای سرور گیمینگ در شیراز

در دو هفته گذشته روی موتور شبکه بازی ام کار می کردم. و قبل از آن، من چیزی در مورد شبکه بازی نمی دانستم. بنابراین، من مقالات زیادی خواندم و آزمایش های زیادی انجام دادم تا همه مفاهیم را بفهمم و بتوانم موتور شبکه خود را کدنویسی کنم.

در این راهنما، می‌خواهم مفاهیم مختلفی را که باید قبل از نوشتن موتور بازی خود و بهترین منابع و مقالات برای یادگیری آنها یاد بگیرید، با شما به اشتراک بگذارم.

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

در حالی که معماری همتا به همتا هنوز در برخی بازی ها استفاده می شود، سرویس گیرنده-سرور استاندارد است زیرا پیاده سازی آن آسان تر است، به پهنای باند کمتری نیاز دارد و جلوگیری از تقلب آسان تر است. بنابراین، در این راهنما، ما بر روی معماری مشتری-سرور تمرکز خواهیم کرد.

به طور دقیق تر، ما به سرورهای معتبر علاقه مند خواهیم بود، به این معنی که سرور همیشه حق دارد. به عنوان مثال، اگر بازیکنی فکر می کند که در مختصات (10، 5) است اما طراحی سرور گیمینگ به او می گوید که در (5، 3) است، مشتری باید موقعیت خود را به موقعیت سرور به روز کند و نه برعکس. استفاده از یک سرور معتبر ما را قادر می سازد تا تقلب را راحت تر تشخیص دهیم.

 

برنامه نویسی سرور بازی

 

در شبکه بازی در شیراز به طور عمده سه جزء وجود دارد:

 

پروتکل حمل و نقل: چگونه داده ها را بین مشتری و سرور منتقل کنیم؟

پروتکل برنامه: چه چیزی از کلاینت به سرور و از سرور به کلاینت و در کدام قالب ارسال شود؟

منطق برنامه: چگونه از داده های مبادله شده برای به روز رسانی کلاینت ها و سرور بازی  استفاده کنیم؟

درک نقش هر بخش و چالش های آن بسیار مهم است.

 

پروتکل حمل و نقل سرور بازی 

بخش اول انتخاب یک پروتکل برای انتقال داده ها بین سرور بازی و مشتریان است. دو پروتکل اینترنتی برای آن موجود است: TCP و UDP. اما شما همچنین می توانید پروتکل حمل و نقل سفارشی خود را بر اساس یکی از آنها بسازید یا از کتابخانه ای استفاده کنید که از آنها استفاده می کند.

 

TCP در مقابل UDP

هر دو TCP و UDP بر اساس IP هستند. IP اجازه می دهد تا بسته ای را از یک منبع به مقصد منتقل کند، اما هیچ تضمینی ندارد که بسته ارسالی در نهایت به مقصد می رسد یا اینکه فقط یک بار می رسد، یا اینکه داده ها در حین انتقال خراب نمی شوند، و یا اینکه دنباله ای از بسته ها به ترتیب می رسند. علاوه بر این، یک بسته تنها می تواند حاوی حجم محدودی از داده باشد که توسط MTU داده می شود.

UDP فقط یک لایه نازک بالای IP است. در نتیجه همین محدودیت ها را دارد. با این حال، TCP دارای ویژگی های زیادی است. این یک اتصال قابل اعتماد، منظم و دارای خطا بین دو میزبان را فراهم می کند. بنابراین TCP واقعا مفید است و در پروتکل های متعدد دیگری مانند HTTP، FTP یا SMTP استفاده می شود. اما همه این ویژگی‌ها هزینه دارند: تأخیر.

به منظور درک اینکه چرا این ویژگی ها ممکن است باعث تأخیر شوند. ما باید نحوه عملکرد TCP را درک کنیم. هنگامی که یک میزبان مبدأ بسته ای را به میزبان مقصد ارسال می کند، انتظار دریافت یک تاییدیه (ACK) را دارد. اگر بعد از مدتی هیچ دریافتی نکند (به دلیل گم شدن بسته آن یا گم شدن تاییدیه یا هر دلیل دیگری)، دوباره بسته را ارسال می کند. علاوه بر این، TCP اطمینان می دهد که بسته ها به ترتیب وارد می شوند، بنابراین در حالی که بسته گم شده دریافت نشده است، سایر بسته ها حتی اگر قبلاً توسط میزبان مقصد دریافت شده باشند، قابل پردازش نیستند.

اما همانطور که می دانید، تاخیر در بازی های ویدئویی چند نفره به ویژه برای بازی های مبتنی بر اکشن مانند FPS مهم است. به همین دلیل است که بسیاری از بازی ها از UDP با یک پروتکل سفارشی استفاده می کنند.

آنها چندین راه هستند که یک پروتکل سفارشی با استفاده از UDP ممکن است کارآمدتر از TCP باشد. به عنوان مثال، می تواند برخی از بسته ها را به عنوان قابل اعتماد و برخی دیگر را به عنوان غیرقابل اعتماد علامت گذاری کند. بنابراین، اهمیتی نخواهد داد که یک بسته غیرقابل اعتماد به مقصد برسد یا نه. یا می تواند چندین جریان داده را مدیریت کند تا بسته از دست رفته در یک جریان باعث کاهش سرعت جریان های دیگر نشود. به عنوان مثال، می‌تواند یک جریان برای ورودی‌های کاربر و یک جریان دیگر برای پیام‌های چت وجود داشته باشد، بنابراین اگر یک پیام چت، که داده‌های غیر فوری است، از بین برود، سرعت ورودی ماشه‌ای را که فوری است، کاهش نمی‌دهد. یا، پروتکل سفارشی می تواند قابلیت اطمینان را به روش دیگری غیر از TCP پیاده سازی کند که تحت فرض بازی های ویدیویی کارآمدتر است.

بنابراین، اگر TCP خیلی مزخرف است، بیایید پروتکل حمل و نقل سفارشی خود را بر اساس UDP پیاده سازی کنیم؟

پیچیده تر از آن است. حتی اگر TCP تقریباً همیشه برای شبکه بازی های ویدیویی کمتر از حد مطلوب باشد. با این وجود ممکن است برای بازی شما خوب عمل کند و از وقت گرانبهای شما صرفه جویی کند. به عنوان مثال، تأخیر ممکن است برای یک بازی گام به گام یا برای بازی‌هایی که فقط در شبکه‌های LAN قابل اجرا هستند، مشکلی ایجاد نکند، جایی که تأخیر و نرخ از دست دادن بسته‌ها بسیار کمتر از اینترنت است.

بسیاری از بازی های موفق مانند World of Warcraft، Minecraft یا Terraria از TCP استفاده می کنند. با این حال، بیشتر FPS ها از یک پروتکل سفارشی مبتنی بر UDP استفاده می کنند، در بخش های بعدی بیشتر در مورد آن صحبت خواهیم کرد.

اگر تصمیم به استفاده از TCP دارید، مطمئن شوید که الگوریتم Nagle غیرفعال است زیرا بسته ها را قبل از ارسال بافر می کند و در نتیجه تأخیر را افزایش می دهد.

برای دانستن بیشتر در مورد تفاوت های UDP و TCP در زمینه بازی چند نفره، می توانید مقاله UDP vs. TCP اثر گلن فیدلر را مطالعه کنید.

 

طراحی سرور بازی در شیراز

 

پروتکل سفارشی سرور بازی

بنابراین می خواهید پروتکل حمل و نقل خود را ایجاد کنید اما مطمئن نیستید از کجا شروع کنید؟ شما خوش شانس هستید زیرا گلن فیلدر دو سری مقاله برنامه نویسی سرور بازی در شیراز عالی نوشت که راهی برای انجام این کار توضیح می داد. در آنجا ایده های هوشمندانه زیادی خواهید یافت.

اولین مورد Networking for Game Programmers از سال 2008 ساده تر از پروتکل دوم Building A Game Network Protocol در سال 2016 است. به شما توصیه می کنم با قدیمی ترین پروتکل شروع کنید.

توجه داشته باشید که گلن فیدلر مدافع قوی استفاده از پروتکل مبتنی بر UDP سفارشی است. و پس از خواندن مقالات او، مطمئناً این دیدگاه را به اشتراک خواهید گذاشت که TCP نقص های عمده ای برای بازی های ویدیویی دارد و می خواهید پروتکل خود را پیاده سازی کنید.

اما اگر تازه وارد شبکه هستید، لطفاً به خودتان لطف کنید و از TCP یا کتابخانه استفاده کنید. مطمئناً قبل از اینکه بتوانید یک پروتکل حمل و نقل سفارشی را با موفقیت پیاده سازی کنید، چیزهای زیادی برای یادگیری دارید.

 

کتابخانه های شبکه

اگر به چیزی کارآمدتر از TCP نیاز دارید، اما نمی‌خواهید اجرای یک پروتکل سفارشی را به زحمت بیندازید و به مشکلات زیادی بپردازید، می‌توانید از کتابخانه شبکه استفاده کنید. تعداد زیادی موجود است:

 

پروتکل حمل و نقل - نتیجه گیری

به طور خلاصه، دو پروتکل انتقال پایه وجود دارد: TCP و UDP. TCP دارای بسیاری از ویژگی های مفید است: قابلیت اطمینان، حفظ نظم بسته، تشخیص خطا، در حالی که UDP ندارد، اما به دلیل طراحی سرور بازی آن TCP دارای تأخیر بالاتری است که ممکن است برای بازی های خاص ناکافی باشد. بنابراین، برای داشتن تأخیر کمتر، می توان یک پروتکل حمل و نقل سفارشی با استفاده از UDP ایجاد کرد یا از کتابخانه ای استفاده کرد که یک پروتکل حمل و نقل مبتنی بر UDP سازگار برای بازی های ویدیویی چند نفره را ارائه می دهد.

انتخاب بین TCP، UDP یا استفاده از کتابخانه به عوامل مختلفی بستگی دارد. اولاً، نیازهای بازی شما: آیا به تأخیر بسیار کم نیاز دارد؟ دوم، نیازهای پروتکل برنامه: آیا به پروتکل قابل اعتماد نیاز دارد؟ همانطور که در قسمت بعدی خواهیم دید، می توان یک پروتکل کاربردی طراحی سرور بازی کرد که با یک پروتکل غیر قابل اعتماد خوب باشد. در نهایت، تجربه توسعه دهنده شبکه.

 

دو نصیحت دارم:

پروتکل حمل و نقل خود را تا حد امکان از بقیه برنامه انتزاعی کنید. به طوری که می توانید به راحتی آن را بدون بازنویسی همه چیز تغییر دهید.

پیش از موعد بهینه سازی نکنید. اگر متخصص شبکه نیستید و مطمئن نیستید که واقعاً به یک پروتکل حمل و نقل سفارشی ساخته شده بر روی UDP نیاز دارید، ممکن است شروع به استفاده از TCP یا کتابخانه ای کنید که قابلیت اطمینان و آزمایش و اندازه گیری را ارائه می دهد. اگر مشکلاتی وجود دارد و مطمئن هستید که از پروتکل حمل و نقل ناشی می شود، ممکن است زمان ایجاد پروتکل حمل و نقل خود باشد.

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

 

پروتکل برنامه

اکنون که راهی برای تبادل داده بین مشتری و سرور بازی  دارید، باید تصمیم بگیرید که چه داده‌هایی و با چه فرمتی مبادله کنید.

طرح کلاسیک این است که کلاینت ها ورودی ها یا اقدامات را به سرور ارسال می کنند و سرور وضعیت فعلی بازی را برای مشتریان ارسال می کند.

سرور کل حالت را ارسال نمی کند، بلکه یک حالت فیلتر شده را با موجوداتی که در اطراف یک بازیکن هستند ارسال می کند. این کار را به سه دلیل انجام می دهد. اولا، کل حالت ممکن است خیلی بزرگتر از آن باشد که با فرکانس بالا منتقل شود. ثانیاً، مشتریان عمدتاً به داده های دیداری و صوتی علاقه مند هستند زیرا بیشتر منطق بازی فقط در سرور بازی شبیه سازی شده است. در نهایت، در برخی از بازی‌ها، بازیکن نباید از برخی داده‌ها مانند موقعیت حریف در انتهای نقشه مطلع باشد، در غیر این صورت می‌تواند بسته‌ها را بو بکشد و دقیقاً بداند که برای کشتن او به کجا مراجعه کند.

 

سریال سازی

اولین قدم این است که داده‌هایی را که می‌خواهیم ارسال کنیم (ورودی‌ها یا وضعیت بازی) را در قالبی مناسب برای انتقال تبدیل کنیم. این فرآیند سریال سازی نامیده می شود.

اولین ایده ممکن است استفاده از یک قالب قابل خواندن برای انسان مانند JSON یا XML باشد. اما به هیچ وجه کارآمد نخواهد بود و پهنای باند زیادی را بیهوده می گیرد.

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

 

می توانید از یک کتابخانه برای کمک به سریال سازی داده های خود استفاده کنید مانند:

 

FlatBuffers توسط Google

Cap’n Proto توسط Sandstorm

غلات توسط Shane Grant و Randolph Voorhies

فقط مراقب باشید که کتابخانه بایگانی های قابل حمل ایجاد کند و از endianness مراقبت کند.

جایگزین این است که همه چیز را خودتان مدیریت کنید، واقعاً دشوار نیست، به خصوص اگر یک رویکرد داده گرا در کد خود داشته باشید. همچنین ممکن است به شما امکان انجام بهینه‌سازی خاصی را بدهد که دستیابی به آن با کتابخانه همیشه ممکن نیست.

گلن فیدلر دو مقاله درباره سریال‌سازی نوشت: بسته‌های خواندن و نوشتن و استراتژی‌های سریال‌سازی.

فشرده سازی

مقدار داده ای که می تواند توسط کلاینت ها و سرور رد و بدل شود با پهنای باند محدود می شود. فشرده‌سازی داده‌های شما ممکن است به شما این امکان را بدهد که داده‌های بیشتری را در هر عکس فوری مبادله کنید، نرخ تازه‌سازی سریع‌تری داشته باشید یا به سادگی نیازهای کمتری در پهنای باند داشته باشید.

گیمینگ در شیراز

بسته بندی بیت سرور بازی در شیراز

اولین تکنیک بسته بندی بیت است. این شامل استفاده از تعداد بیت هایی است که برای نمایش یک کمیت معین نیاز دارید. به عنوان مثال، اگر شمارشی دارید که می تواند 16 مقدار مختلف بگیرد، به جای یک بایت کامل (8 بیت) فقط از 4 بیت استفاده خواهید کرد.

گلن فیدلر نحوه دستیابی به آن را در قسمت دوم بسته های خواندن و نوشتن توضیح می دهد.

بسته بندی بیت به ویژه با کوانتیزاسیون که موضوع بعدی است به خوبی کار می کند.

 

کوانتیزاسیون

کوانتیزاسیون یک تکنیک فشرده سازی با اتلاف است که تنها شامل استفاده از زیر مجموعه ای از مقادیر ممکن برای رمزگذاری یک کمیت است. ساده ترین راه برای رسیدن به کوانتیزه کردن، کوتاه کردن اعداد ممیز شناور است.

گلن فیدلر (دوباره!) نحوه استفاده از کوانتیزاسیون در عمل را در مقاله فشرده سازی عکس فوری خود نشان می دهد.

Shawn Hargreaves همچنین مقالات جالبی در مورد فشرده سازی از جمله کوانتیزاسیون دارد که می توانید همه آنها را اینجا بیابید.

 

الگوریتم های فشرده سازی سرور بازی در شیراز

تکنیک بعدی استفاده از الگوریتم های فشرده سازی بدون تلفات است.

به نظر من، سه الگوریتم جالب تر که باید بدانید عبارتند از:

کد نویسی هافمن با یک کد از پیش محاسبه شده که بسیار سریع است و می تواند نتایج خوبی بدهد. برای فشرده سازی بسته ها در موتور شبکه Quake3 استفاده شد.

استفاده از zlib که یک الگوریتم فشرده سازی همه منظوره است و هرگز داده ها را گسترش نمی دهد. همانطور که در اینجا مشاهده می کنید در برنامه های متعدد استفاده می شود. ممکن است برای به روز رسانی های ایالت بیش از حد باشد. اما ممکن است جالب باشد اگر مجبور باشید دارایی‌ها، متن‌های طولانی یا زمین‌هایی را از سرور به مشتریان ارسال کنید.

رمزگذاری طول اجرا شاید ساده ترین الگوریتم فشرده سازی باشد اما برای انواع خاصی از داده ها بسیار کارآمد است. این به طور خاص برای فشرده سازی زمین های ساخته شده از کاشی یا وکسل که بسیاری از عناصر مجاور مشابه هستند، مناسب است.

همچنین یک کتابخانه پولی توسط Rad Game Tools به نام Oodle Network Compression وجود دارد. در صفحه، آنها نمودار جالبی را نشان می دهند که در آن نسبت فشرده سازی کدگذاری هافمن، zlib و راه حل آنها را مقایسه کردند، بسیار آموزنده.

 

فشرده سازی دلتا

آخرین تکنیک فشرده سازی فشرده سازی دلتا است. این شامل ارسال تنها تفاوت بین وضعیت فعلی بازی و آخرین وضعیت دریافت شده توسط مشتری است.

این اولین بار در موتور شبکه Quake3 استفاده شد، در اینجا دو مقاله توضیح داده شده است که چگونه از آن استفاده شده است:

مدل شبکه سازی Quake3 توسط برایان هوک

بررسی کد منبع Quake 3: مدل شبکه توسط فابین سانگلارد

گلن فیدلر نیز در قسمت دوم مقاله خود فشرده سازی عکس فوری از آن استفاده کرد.

رمزگذاری

در نهایت، ممکن است بخواهید به چند دلیل ارتباط بین مشتری و سرور را رمزگذاری کنید:

حریم خصوصی/محرمانه بودن: پیام ها را فقط گیرنده آن می تواند بخواند، هر شخصی که شبکه را استشمام کند قادر به خواندن آنها نخواهد بود.

اصالت: هر شخصی که بخواهد جعل بازیکنی باشد باید کلید آن را بداند.

جلوگیری از تقلب: برای بازیکنان مخرب ایجاد بسته های سفارشی برای تقلب بسیار سخت تر خواهد بود، آنها باید طرح رمزگذاری را بازتولید کنند و کلید را پیدا کنند (که در هر اتصال تغییر می کند).

اکیداً به شما توصیه می کنم که از کتابخانه برای کمک به شما استفاده کنید. من لیب سدیم را پیشنهاد می کنم زیرا استفاده از آن بسیار ساده است و آموزش های عالی ارائه می دهد. به طور خاص با آموزش تعویض کلید برای ایجاد کلیدهای جدید برای هر اتصال جدید علاقه مند خواهید شد.

 

پروتکل برنامه - نتیجه گیری

این همه برای این بخش است. من فکر می کنم که فشرده سازی کاملا اختیاری است و بستگی به بازی شما و میزان پهنای باند مورد نیاز دارد. به نظر من رمزگذاری اختیاری نیست، اما ممکن است در اولین نمونه اولیه از آن صرفنظر شود.

 

منطق برنامه

اکنون می‌توانید وضعیت را در کلاینت به‌روزرسانی کنید، اما ممکن است با مشکلات تاخیر مواجه شوید. در واقع، شما باید منتظر بروزرسانی وضعیت بازی از سرور پس از راه اندازی یک ورودی باشید تا تأثیر آن را در جهان ببینید.

علاوه بر این، بین دو به روز رسانی حالت، جهان کاملاً ثابت است. بنابراین، اگر نرخ به‌روزرسانی وضعیت پایین باشد، حرکات کاملاً قطع می‌شوند.

چندین تکنیک برای کاهش این مشکلات وجود دارد که در بخش بعدی ارائه خواهم کرد.

 

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

تمام تکنیک های ارائه شده در این بخش به صورت عمیق در بازی چند نفره سریع توسط Gabriel Gambetta ارائه شده است. اکیداً به شما توصیه می کنم این سری از مقالات را بخوانید که عالی است. همچنین یک نسخه نمایشی زنده برای مشاهده نحوه عملکرد این تکنیک ها در عمل وجود دارد.

اولین تکنیک این است که نتیجه یک ورودی را مستقیماً بدون انتظار برای پاسخ از سرور اعمال کنید. به آن پیش بینی سمت مشتری می گویند. با این حال، هنگامی که مشتری یک به روز رسانی را از سرور دریافت می کند، باید بررسی کند که پیش بینی آن درست بوده است، در غیر این صورت، باید وضعیت خود را مطابق با آنچه از سرور دریافت کرده است تغییر دهد زیرا سرور مرجع است. این تکنیک برای اولین بار در Quake مورد استفاده قرار گرفت، می توانید در بررسی کد Quake Engine توسط Fabien Sanglard بیشتر بخوانید.

مجموعه دوم تکنیک ها برای هموارسازی حرکت سایر موجودیت ها بین دو به روز رسانی حالت است. دو راه برای رسیدن به این هدف وجود دارد: با انجام درون یابی یا برون یابی. درون یابی استفاده از دو حالت آخر و نشان دادن انتقال از یکی به دیگری است. اشکال آن این است که کمی تأخیر ایجاد می کند زیرا مشتری همیشه آنچه را که در گذشته اتفاق افتاده است نشان می دهد. برون یابی شامل پیش بینی اینکه موجودیت ها بر اساس آخرین وضعیتی که مشتری دریافت کرده است، در کجا قرار دارند. اشکال آن این است که اگر یک موجودیت به طور کامل جهت خود را تغییر دهد، یک خطای بزرگ بین پیش بینی و موقعیت واقعی وجود خواهد داشت.

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

گلن فیدلر (همیشه!) فیزیک شبکه (2004) را در سال 2004 نوشت، جایی که او پایه های همگام سازی یک شبیه سازی فیزیک بین یک سرور و یک کلاینت را بنا نهاد. در سال 2014، او یک سری مقالات جدید به نام فیزیک شبکه نوشت که در آن تکنیک های بیشتری برای همگام سازی یک شبیه سازی فیزیک نشان داد.

همچنین دو مقاله در ویکی Valve وجود دارد، شبکه‌های چند نفره منبع و روش‌های جبران تاخیر در طراحی و بهینه‌سازی پروتکل درون بازی کلاینت/سرور، که به جبران تاخیر می‌پردازد.

طراحی برنامه نویسی سرور

پیشگیری از تقلب

عمدتاً دو راه برای تقلب در یک بازی چند نفره وجود دارد: ارسال بسته‌های مخرب به سرور یا خواندن داده‌هایی که از سرور به دست می‌آیند و مزیت غیرمنصفانه‌ای را برای متقلب به ارمغان می‌آورند.

اولین تکنیک این است که ساختن بسته های مخرب و خواندن بسته های دریافتی را برای متقلبان سخت کنیم. همانطور که قبلا توضیح دادیم، رمزگذاری راه خوبی برای دستیابی به آن است، زیرا بسته‌های ورودی را مبهم می‌کند و کلاهبرداران باید کلیدها را دریافت کنند و طرح رمزگذاری را برای ساخت بسته‌های مخرب بازتولید کنند.

تکنیک دوم داشتن یک سرور معتبر است که فقط دستورات/ورودی/عملیات را دریافت می کند. کلاینت هرگز نباید بتواند وضعیت سرور را با روشی غیر از ارسال ورودی تغییر دهد. سپس، هر بار که سرور یک ورودی دریافت می کند، قبل از اعمال آن باید بررسی کند که این ورودی معتبر است.

بهترین روش برای جلوگیری از دسترسی افراد متقلب به داده‌هایی که نباید از آنها اطلاع داشته باشند، صرفاً اطمینان از عدم ارسال آن توسط سرور در وهله اول است. به عنوان مثال، سرور نباید موقعیت حریفان یا هیولاهایی را که از آنها دور هستند برای بازیکنان ارسال کند. در غیر این صورت، حتی اگر در بازی قابل مشاهده نباشند، بازیکنان می توانند بسته های دریافتی را بخوانند و دقیقا بدانند که برای کشتن اهداف خود به کجا مراجعه کنند. این نوع تقلب را هک نقشه یا هک جهان می نامند.

اگر می‌خواهید در مورد تقلب بیشتر بدانید، می‌توانید مقاله تقلب در بازی‌های آنلاین را در ویکی‌پدیا بخوانید که شامل فهرستی از راه‌های احتمالی تقلب و راه‌حل‌هایی برای شناسایی و پیشگیری از آن‌ها است.

 

منطق کاربردی - نتیجه گیری

من به شما توصیه می کنم راهی برای شبیه سازی تاخیر بالا و نرخ رفرش پایین در بازی خود پیاده سازی کنید تا بتوانید بازی خود را در شرایط بد تست کنید حتی اگر هم کلاینت و هم سرور روی رایانه شما در حال اجرا هستند. اجرای تکنیک های کاهش تأخیر را بسیار ساده می کند.