مرجع اموزش بازی سازی با یونیتی https://rosedev.ir
ساخت سرور بازی برای یونیتی
در این مقاله سعی خواهم کرد تا انواع روش های ساخت یک سرور بازی , برای ساخت بازی آنلاین در یونیتی را توضیح دهم , قبلا مقاله ای راجب مقدمه ورود به بازی های آنلاین نوشته بودم که در آن یکسری از سرور های آماده رو توضیح داده بودم حال در این مقاله کمی عمیق تر این موضوع را بررسی خواهیم کرد.
نحوه برقراری ارتباط
تمامی روش های ساخت سرور حتی با وجود تفاوت هایی که دارند ارسال و دریافت اطلاعات را تا حدود زیادی مشابه به هم انجام میدهند به طوری که گاها حتی با وجود تفاوت در زبان برنامه نویسی نیز تفاوت چندانی در نوع و سرعت ارتباط در بین آنها دیده نمیشود.
در کل تمام سرور ها سه ویژگی دارند که آنها را مورد بررسی قرار میدهیم .
دو مورد اول نوع سرور می باشد که به نام های UDP و TCP شناخته میشوند که در آینده با این نوع سرور ها کار خواهیم کرد و مورد آخر CCU سرور هست که در خیلی از سایت ها زیاد مورد بررسی قرار نگرفته در این مقاله کمی در مورد سه مورد بالا توضیح خواهم داد.
سرور نوع TCP چیست ؟
- اگر بخواهیم به صورت خیلی ساده این موضوع توضیح دهیم ساده ترین حالت آن اینطور میشود که : سروری است که تمامی اطلاعات ارسالی را چک میکند که آیا به مقصد ( کلاینت ) رسیده است یا خیر , اگر رسیده باشد که هیچ ولی اگر کلاینت اطلاعات ارسالی را دریافت نکرده باشد سرور دوباره برای کلاینت ارسال میکند و در حالت کلی می توان اینگونه در نظر گرفت که اطلاعات ارسالی در سرور TCP همیشه به مقصد میرسند .
- از این نوع سرور برای ساخت انواع پیام رسان ها و بازی ها استفاده میشود ولی با توجه به رهگیری مدام بسته های ارسالی سرعت این نوع سرور برای ساخت بازی های رئال تایم مناسب نیست و بیشتر برای بازی های نوبتی یا فکری مناسب میباشد.
سرور نوع UDP چیست ؟
در سرور های UDP پکیج های ارسالی به صورت دایم و بدون رهگیری ارسال میشوند و از این رو این نوع ارتباط دارای سرعت خیلی بالایی نسبت به TPC است که همین امر باعث میشود تا این نوع سرور مناسب بازی های رئال تایم باشد , یکی از معایب این نوع ارتباط از دست رفتن پکیج های ارسالی میباشد که ممکن است توسط کلاینت هرگز دریافت نشوند ولی با وجود سرعت بسیار بالای این نوع سرور براحتی میشود اطلاعات ارسالی را چک کرد.
CCU چیست ؟
در حالت کلی ساده ترین تعریفی که میتوان برای ccu عنوان کرد در واقع تعداد یوزرهایی است که بصورت همزمان به سرور ما وصل شده اند و سروری که بتواند تعداد ccu های بیشتری را در هر سیشن ساپورت کند طبیعتا بهتر و قوی تر است , البته بسته به نوع بازی ای که میخواهیم توسعه دهیم باید نوع سرور را انتخاب کنیم و در موقع انتخاب به حداکثر ccu که لازم داریم باید دقت داشته باشیم , مثلا برای بازی ای مثل بازی هشت خوان که یک بازی کارتی و نوبتی هست یک سرور tcp کاملا انتظارات ما را براورده خواهد کرد و برای یک بازی مانند کال اف موبایل و … حتما به یک سرور از نوع udp و با قابلیت ساپورت ccp بالا نیازمندیم.
روش های ایجاد ساخت سرور
- روش لو لول یا LLAPI : پایه ای ترین نوع ساخت سرور این نوع میباشد در این روش سرور را از 0 تا 100 کاملا اختصاصی و بر اساس نیاز و نوع بازی می سازیم , بهترین مزیت این روش بهینه بودن و سبک بودن آن است و تنها ایراد آن این است که نیاز به دانش برنامه نویسی بالایی دارد , از آنجایی که این روش سخت ترین روش ممکن برای ساخت بازی آنلاین آموزش های بسیار کمی در مورد آن منتشر شده است .
- روش مید لول یا MLAPI : همانطور که از اسمش پیداست یه روش سطح متوسط است که در این نوع سرور نویسی بخشی از کدها و پل های ارتباطی قبلا برنامه نویسی شده اند و کار را تا حدودی راحت میکند. از نظر بهینه بودن کدها هم تا حدودی خوب است.
- روش های لول یا HLAPI : در این روش بیش از 80 درصد کدهای مورد نیاز نوشته شده و آماده است مثلا برای ارسال position کاربر کافیه تا کامپوننت آن را به آبجکت اضافه کنید. این روش برای پروژه های کوچک مناسب تره تا پروژه های بزرگ چون استفاده از کدهای آماده باعث پیچیده شدن برخی فرایندها میشه ( البته برای پروژه های بزرگ هم جوابگو هست ) مثلا برای یه سروری که حدود 2000 سطر کد داره دیباگ کردن رو مشکل میکنه و گاها روش های ارسال و دریافت هم بهینه نیستند البته در پکیج netcode کاربر میتونه از خاصیت پیام های شخصی هم استفاده کنه ولی من نمی پسندم و این کاملا سلیقه ای است.
معرفی برخی از پکیج های ساخت بازی آنلاین در یونیتی
در جدول بالا برخی از پکیج ها و سرویس های مرتبط با ساخت سرور بازی معرفی شده است که میتوانید مشاهده کنید من فقط یه توضیح کوتاه بدم که سه مورد بالا تا جایی که بنده اطلاع دارم اولا فیلتر هستند و دوما تحریم هستیم و سوما هزینه ماهیانه بر اساس ccu می خواهند که به هیچ وجه مناسب ایرانی ها نیستند یا حداقل مناسب تیم های کوچک و استارت آپی نیستند البته دارک ریفت رو کار نکردم و اطلاعی هم ندارم ( چون تو جدول بالا نوشته 100 دلار برای سورس )
در کنار لیست بالا من یه لیست کامل از انتخاب هایی که برای ساخت سرور داریم رو براتون مینویسم :
- اولین گزینه ما transport می باشد یک روش LLAPI بر پایه محاسبات JOB که سرعت و انعطاف بسیار بالایی دارد و رایگان و open source است.
- گزینه دوم netCode که بر اساس monobehaviour می باشد و با توجه به وجود گزینه های های لول بهتر مانند netcodeForEntity که یه نسخه بهتر بر اساس سیستم dots یادگیریش رو توصیه نمیکنم ( فعلا هنوز در حالت preview می باشد )
- گزینه سوم : mirror تا جایی که تحقیق کردم سرعت خوبی داره و یکی از معایب اون پیچیده بودن داکیومنت اون هست که کمی یادگیری رو مشکل میکنه. ولی در کل api خوبی است و اگر قرار به دسته بندی باشه در دسته HLAPI ها قرار میگیره .
- گزینه mlapi هم تا جایی که میدونم در حال منسوخ شدن هست و از لیست پکیج های یونیتی هم حذف شده و یادگیریش رو توصیه نمیکنم.
به جز پکیج های بالا روش های زیادی برای ساخت سرور وجود دارد از ساخت کنسول اپ با سی شارپ گرفته تا ساخت سرور با تایپ اسکریپت و اینکه از کدام روش استفاده کنید کاملا بسته به خودتونه.
تفاوت اصلی تمام سرور ها
پس با توجه به روشهای بالا میبینیم که تعداد خیلی زیادی از پکیج ها و سرویس ها برای ساخت سرور بازی وجود دارند با این حال چه عاملی باعث بهتر بودن یا بدتر بودن یک روش میشود ؟
در پاسخ به آن می توان گفت که روش انتخابی شما باید از هر نظر به صرفه باشد یعنی چه از نظر یادگیری و داکیومنت ها و چه از نظر زمان ساخت و مدیریت توابع و سیستم مدیریت سرور و حتی فایل اجرایی سرور ( نوع فرمت سیستم مورد نیاز و امنیت کدها و … )
و در آخر میزان بازدهی سرور باید قابل قبول باشد و حتی به جرات میتوان گفت که بازدهی سرور خیلی مهمتر از تمام موارد بالاست به طوری که هزینه ماهیانه ای که برای نگهداری و انلاین نگه داشتن سرور خرج میشود باید نسبت به بازدهی آن قابل قبول و منطقی باشد.
پس سروری مناسب است که تمام موارد بالا را باهم یا با اولویت بندی اختصاصی شما داشته باشد .
در مورد بازدهی استفاده از متدهای پیشرفته تر و مولتی تردینگ برای سرور بسیار حائز اهمیت است.
در صورتی که سوالی دارید میتوانید در اینجا بپرسید . باتشکر
مطلبی دیگر از این انتشارات
شیوه محاسبه Batching در یونیتی
مطلبی دیگر از این انتشارات
اتصال یونیتی به MySQL
مطلبی دیگر از این انتشارات
اصل جداسازی Interface ها