آموزش ساخت بازی چندنفره: مفاهیم اوّلیّه

چند بازی‌کن می‌توانند به یک بازی ملحق شوند؟

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

مشکل اینجاست که هاست اطّلاعاتی را که از n بازی‌کن دریافت کرده است، می‌خواهد به هرکدام از دیگر بازی‌کن‌ها بفرستد. برای مثال اگر هاست بخواهد 16 بایت داده به هر بازی‌کن ارسال کند، ابتدا باید از هرکدام از بازی‌کن‌ها 16 بایت داده دریافت شود که اگر تعداد بازی‌کن‌ها nتا باشد بایت داده دریافت می‌شود. حالا این داده‌ها قرار است به همه‌ی بازی‌کن‌ها (n بار) ارسال شود، در نتیجه عدد قبلی n برابر شده و هاست باید بایت داده ارسال کند. مثلاً:

10 بازی‌کن = 16×10×10 = 1600 بایت برای هر بروزرسانی
20 بازی‌کن = 16×20×20 = 6400 بایت برای هر بروزرسانی
30 بازی‌کن = 16×30×30 = 14400 بایت برای هر بروزرسانی

100 بازی‌کن = 16×100×100 = 160000 بایت برای هر بروزرسانی

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

به طور پیش‌فرض به‌روزرسانی‌ها 30 بار در یک ثانیه ارسال می‌شوند، پس در مثال قبل با 100 بازی‌کن، عملاً هاست باید دارای پهنای باندی در حدود 5 مگابایت بر ثانیه (یا 40 مگابیت بر ثانیه) باشد. این مقدار برای یک اینترنت خانگی بسیار زیاد است، امّا برای یک سرور اختصاصی خیر.

گذشته از این، هاست باید بتواند بازی را برای تعداد زیادی بازی‌کن اجرا کند و وظایفی مثل جبران lag و بررسی‌های برخورد را انجام دهد که باعث می‌شود شدیداً از CPU استفاده شود. درضمن اگر هاست یکی از بازی‌کن‌ها باشد، بازی باید برایش رندر هم بشود. معمولاً مقدار کلّ کاری که باید CPU انجام دهد با افزایش تعداد بازی‌کن‌ها به سرعت زیاد می‌شود، اگرچه حدّاکثر تعداد بازی‌کن‌ها بسته به نوع بازی و اتّصال اینترنت متفاوت است، ولی تقریباً پیوستن بیش از 100 بازی‌کن به بازی غیر ممکن است.

تنظیم فرمت به‌روزرسانی‌ها

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

اگر با بیت (bit)، بایت (byte) و باینری (binary) آشنایی ندارید، می‌توانید مقاله‌های بایت و باینری را در ویکی‌پدیا مطالعه کنید و یا در این باره در گوگل جستجو کنید. به طور خلاصه، در کامپیوتر تمام اعداد در مبنای 2 (دستگاه باینری) نگه‌داشته می‌شوند: در این مبنا هر رقم فقط می‌تواند 0 و یا 1 باشد. یک بایت 8 بیت است، پس می‌تواند 28 (256) مقدار مختلف داشته باشد، یا مقداری از 0 تا 255. بایت‌های بیشتر می‌توانند محدوده‌ی وسیع‌تری از اعداد را در خود نگه دارند. بعضی از انواع اعداد اعشاری مثل 0.3 حدّاقل 4 بایت را اشغال می‌کنند.

نوع مقادیری که در کانستراکت 2 می‌توانید استفاده کنید به شرح زیر است:

High﴿ double، هشت بایت): یک عدد double-precision floating-point که می‌تواند اعداد اعشاری را با دقّت زیاد در حدود 15 تا 17 رقم اعشار در خود نگه‌دارد. ولی به تنهایی برای یک عدد 8 بایت حجم می‌گیرد، که می‌تواند استفاده از پهنای باند را بی‌خودی افزایش دهد. در عمل انتخاب این نوع مقدار بعید است، مگر در مواقعی که واقعاً ضروری باشد.

Normal﴿ float، چهار بایت): یک عدد single-precision floating-point که می‌تواند اعداد اعشاری را با دقّت حدود 6 تا 9 رقم اعشار را در خود نگه دارد. یعنی بعضی از اعداد به اعدادی با تعداد اعشار کم‌تر گرد می‌شوند. با این‌حال در عمل استفاده از این نوع مقدار به صرفه‌تر از double است، چون حجمی نصف double دارد و ارقام اعشاری بعد از رقم ششم معمولاً اهمّیّتی ندارند (مثلاً 0.333333 به اندازه‌ی کافی دقیق هست و واقعاً نیازی به 0.333333333333333 نداریم.)

Low﴿ int16، دو بایت): یک عدد صحیح 16 بیتی که فقط می‌تواند در محدوده‌ی 32768- تا 32767 قرار داشته باشد.

Very low﴿ uint8، یک بایت): یک عدد حسابی 8 بیتی که فقط می‌تواند در محدوده‌ی 0 تا 255 قرار داشته باشد.

برای کاهش میزان مصرف پهنای باند، باید تا حدّ امکان کم‌ترین دقّتی را که اثر مهمّی در روند بازی ایجاد نکند انتخاب کنیم. مثلاً برای مختصّات X و Y دقّت نوع low﴿ int16) مناسب است. زیرا معمولاً اندازه‌ی لیوت بیشتر از 3267×3267 نیست، و اعشارِ مختصّات پیکسل‌ها اثری در روند بازی ندارد. این دقّت کاملاً کافی است و نسبت به double چهاربرابر کم‌تر از پهنای باند استفاده می‌کند.

دقّت low﴿ int16) و Very low﴿ uint8) برای ورودی‌هایی که پیرها وارد می‌کنند و به هاست فرستاده می‌شود مفید است. با استفاده از اکسپرشن‌های setbit، getbit و togglebit در کانستراکت 2 می‌توانید بیت‌هایی جداگانه را در این اعداد قرار دهید. اگر یک بازی از 4 کلید جهتی برای حرکت و از Space برای شلّیک استفاده کند، فقط 5 ورودی وجود دارد، که همه‌اش می‌تواند در یک 8 بیت ذخیره شود با این حساب که صفر نشان دهنده‌ی این است که کلید مورد نظر در حال فشار داده شدن نیست و یک نشان‌دهنده‌ی این است که کلید مورد نظر دارد فشار داده می‌شود. بعد هاست می‌تواند به هرکدام از بیت‌ها نگاه کند و ورودی مناسب با آن را شبیه‌سازی کند. همه‌ی این‌ها فقط یک بایت حجم می‌گیرند. اگر شما بیشتر از 8 ورودی دارید می‌توانید از یک مقدار int16 استفاده کنید، با این‌کار در استفاده از پهنای باند خیلی صرفه‌جویی می‌کنید. به طریق مشابه، هاست هم می‌تواند چندین حالت روشن/خاموش[1] را در قالب یک مقدار به پیرها بفرستد.

[1] منظور چیزهایی در بازی هست که نمی‌توانند بیش از دو حالت داشته باشند

سؤالات فنی خود را فقط در انجمن بپرسید. در غیر این صورت پاسخ داده نخواهد شد.
۳۳ نظر

افزودن دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

تمامی حقوق برای مرجع تخصصی کانستراکت محفوظ است.