دلیل اختصاصی بودن موتور های بازی سازی کمپانی های بزرگ
فهرست مطالب
در این مقاله قصد پاسخدهی کامل به یک سوال متداول را بین کاربران داریم.
دلیل اختصاصی بودن موتورهای بازی سازی کمپانی های بزرگ !!
بسیاری از کاربران پرسیده بودند که چرا کمپانی های بزرگ معمولا موتورهای بازی سازی اختصاصی دارند ؟
همانطور که ما در مقاله ی بهترین موتورهای بازی سازی گفتیم ، موتورهای بازی سازی زیادی وجود دارد ؛ از یونتی تا آنریل اما با حساب وجود داشتن این موتورهای بازی چرا باز برخی از کمپانی های موتورهای اختصاصی خود را برای بازی ها می سازند.
موتورهای یونیتی و آنریل و همچنین موتورهایی از جمله Cocos ، CryEngine نقش اصلی را در صنعت بازی ایفا کرده اند که طی ۲۰ سال گذشته از ۱۵ میلیارد دلار به ۱۴۰ میلیارد دلار افزایش یافته است.
و مسیر رشد ادامه دارد.
گزارش اخیر Juniper Research نشان داد که ارزش صنعت بازی های ویدیویی در سال ۲۰۲۳ از ۲۰۰ میلیارد دلار فراتر خواهد رفت.
مقدمه
خب اجازه دهید قبل از ادامه ی کار با هسته ی کار موتور های بازی سازی آشنا شویم و بدانیم که به صورت کلی موتورها چگونه کار می کنند.
موتورهای بازی مجموعه های پیچیده ای از اجزای عملکردها هستند که بسیاری از عملکردهای مفید را برای ایجاد بازی ها ارائه می دهند.
برخلاف چارچوبهای توسعه عمومی مانند Cocoa Touch (برای ایجاد برنامههای iOS) یا داتنت (برای ایجاد برنامههای کاربردی ویندوز)، موتورهای بازی بهطور خاص برای ایجاد بازیها طراحی شدهاند و همه اجزای آنها برای انجام این کار سازماندهی شدهاند .
مشخصا استفاده از یک موتور بازی سازی آماده مانند یونیتی و آنریل بسیار ساده تر و با چالش های کمتری همراه است.
و این یک پیشنهاد کاملاً منطقی است.
به طور کلی در بازی سازی یک نکته ی مهم در مورد دور زدن موانع و چالش ها است.
این دور زدن به این معناست که شما تا جای ممکن از چالش های سخت و آزار دهنده فرار کرده و حتی در خیلی از جاها از asset های آماده استفاده کنید.
با متغیرهای بسیار زیاد و پیچیدگی روزافزون ، داشتن موتوری که برخی از این وظایف سخت را انجام می دهد ، می تواند به شما کمک کند روی چیزی که واقعاً مهم است تمرکز کنید.
بسیار خوب ، پس از این همه موعظه ، باز فکر می کنید دلیل استفاده از موتورهای اختصاصی چیست ؟
با ما در ادامه برای پاسخ به این سوال همراه باشید.
نیاز ما به موتور بازی سازی اختصاصی
بالاخره رسیدیم به اولین بخش برای پاسخ به این سوال مهم.
داشتن یک موتور مناسب برای هر بازی ، این امکان را فراهم می کند که بک اند آن موتور در صورت نیاز تنظیم شود تا مطابق با نیازهای فردی باشد که فقط برای آن بازی منطقی است.
به عنوان مثال ، برخی از بازی ها دارای چندین آبجکت هستند که چندین بار در هر فریم با هم برخورد می کنند ، در حالی که در بازی های دیگر به ندرت ابجکت ها با هم برخورد می کنند.
بسته به ماهیت بازی ، کد موتور بازی را می توان تغییر داد تا منابع را در زیرسیستم های دیگر آزاد کند.
همه چیز در مورد استفاده از موتور برای فشرده کردن تمام عملکرد ممکن است.
به همین دلیل است که شاهد اجرای نرم بازی های پیچیده AAA هستیم ، در حالی که بازی های ساده تر ممکن است برای رسیدن به مقادیر قابل قبول فریم ریت نیز مشکل داشته باشند.
به طور کلی و خلاصه می توان گفت نیاز اصلی برای نوشتن یک موتور بازی سازی مبحث بهینه سازی و استفاده از منابع مورد نیاز است.
اما سایر دلایل چیست ؟
دلایل دیگری که باعث ساخت موتورهای بازی سازی اختصاصی توسط کمپانی های بزرگی مانند : راک استار ، دایس ، EA و … می شود ، عبارتند از :
Novel Tech :
میخواهید بازی ای بسازید که از فناوری جدیدی استفاده میکند که در حال حاضر هیچ موتور دیگری از آن پشتیبانی نمیکند، یا نمیتوان آن را به راحتی در وضعیت فعلیاش پشتیبانی کرد.
این میتواند به معنای نوعی شبیه سازی در مقیاس عظیم باشد که برای ساختن عملکردی (Factorio) به کدنویسی کاملاً metal نیاز دارد.
قطعه سخت افزاری که موتورهای فعلی از آن پشتیبانی نمی کنند (Playdate) یا هر چیز دیگری.
این اولین دلیل خوب برای ساخت یک موتور اختصاصی است.
Specialization :
شما می خواهید گردش کار خود را برای نوع بازی هایی که می سازید بهینه کنید.
شما به همه ویژگیهای موجود در یک موتور بازی تجاری نیاز ندارید ، و میتوانید خط asset pipeline / level editor خود را برای استفاده راحت تر در هنگام در نظر گرفتن موارد استفاده خاص خود به جای اینکه نیاز به استفاده عمومی داشته باشید، ایجاد کنید.
Specialization تقریباً یکی از الزامات ساخت موتور خود است ، اگر آن را Specialization نمیکنید و آن را به طور دقیق مورد استفاده خود قرار نمیدهید ، باید در وهله اول به این فکر کنید که چرا یک موتور میسازید.
(به طور ساده مفهوم این بخش همان بهینه سازی موتور برای نیازهای تخصصی خود است.)
اختصاصی :
شاید شما نمی خواهید در دراز مدت به فناوری دیگران وابسته باشید.
انگیزهها و ارزشهای شرکتی مانند Unity یا Epic همیشه با شرکت شما هماهنگ نیست، و شما میخواهید بر روی فناوری خود کنترل داشته باشید ، به جای اینکه منتظر و امیدوار باشید ، خودتان بتوانید باگها را رفع کنید.
و یا راحت باشید که به روزرسانی های آینده ی هر موتوری پروژه فعلی شما را به طور کامل خراب نمی کند.
شما حاضرید هزینه توسعه فناوری خود را بپردازید ، زیرا در درازمدت خوب است که مجبور نباشید دائماً چیزها را بسته به توسعه های شرکت های غول پیکری مثل epic تغییر دهید.
ساخته شده از قبل :
این دلیل به این منظور است که بیشتر اوقات کمپانی های بزرگ موتورهای اختصاصی خودشان را سالها پیش قبل از اینکه هر یک از موتورهای بازی سازی امروزی با توسعه و پیشرفت الانشان ، برای نوع بازیای که میسازند قابل اجرا باشد، ساختهاند ، و در این مرحله تغییر آن بسیار مشکل است.
چالش های ساخت یک موتور بازی سازی
قطعا نوشتن یک موتور بازی سازی یکی از سخت ترین چالش های موجود برای هر برنامه نویسی می باشد.
این کاری است که نیاز به زمان و تلاش زیادی دارد.
ممکن است سال ها طول بکشد تا شما چیزی بسازید که بی نقص به نظر برسد.
اما این یک تجربه فوق العاده رضایت بخش است.
به طور کلی همانطور که گفته شد ، ساختن یک موتور بازی سخت است ، اما اگر انتظارات و محدوده خود را به درستی تنظیم کنید ، نوشتن یک موتور بازی می تواند پروسه ی ساده تری شود.
برای ساخت یک موتور می توان گفت که باید از کوچک شروع کنید و از یک رویکرد تکراری استفاده کنید.
لازم نیست همه چیز را از ابتدا بنویسید ؛ از کتابخانه های شخص ثالث استفاده کنید.
ماژولهای رایگان و منبع باز وجود دارند که میتوانند به شما در ریاضیات ، ECS ، UI ، گزارشها و … کمک کنند.
این کتابخانهها معمولاً از هر چیزی که خودتان مینویسید قابل اعتمادتر هستند.
می توانید از آنها استفاده کنید و همچنان با چسباندن قطعات به یکدیگر یک موتور بازی عالی ایجاد کنید.
نمونه های محبوب کتابخانه هایی مانند GLM، Dear ImGui، EnTT و Flecs هستند.
قبل از شروع ، تصمیم بگیرید که موتور بازی شما دو بعدی یا سه بعدی باشد.
یک سبک را برای بازی سازی انتخاب کنید و به ساخت موتور خود بر اساس آن بچسبید.
و در نکته ی نهایی می توان گفت که همیشه قبل از شروع کدنویسی ، مرزهای مشخصی را برنامه ریزی و مشخص کنید.
وسوسه شدن برای اضافه کردن ویژگی های جدید مهیج در حین پروسه ی ساخت ، بسیار آسان است اما اینکار احتمال اینکه به یک پروژه موتور بازی ناتمام ختم نشوید را افزایش می دهد ، زیرا هر قابلیت های چالش های و الگوریتم های خودش را دارد.
خود موتورهای بازی نیز تمایل دارند که بر فریمورکهای سطح پایینتری مانند SDL و OpenGL ساخته شوند و شامل بسیاری از کتابخانههای خاص برای مواردی مانند صدا ، فیزیک ، ریاضی و هر چیز دیگری است که در آنجا مفید است. ساختن یک موتور بازی سفارشی به این معنی نیست که هر قطعه کوچکی از آن را خودتان بنویسید.
مجموعه مناسبی از کتابخانههای موجود برای استفاده شما نیز بخشی از ساخت موتور است و تقریباً برای تمام سیستمهایی که میتوانید در موتور خود بخواهید، کتابخانههایی وجود دارد.
به هر حال با در نظر گرفتن این موضوع ، اجازه دهید کمی در مورد آنچه که من به عنوان اساسی ترین مجموعه ویژگی هایی که برای موتور بازی خود نیاز دارید صحبت کنیم.
برخی از ملزومات مهم برای ساخت یک موتور بازی سازی
۱- استفاده از کتابخانه ها
باز کردن یک پنجره ، به دست آوردن یک OpenGL/DirectX/Vulkan context ، مقداردهی اولیه صدا و مواردی از این قبیل را SDL برای شما انجام می دهد،
بنابراین فقط از SDL استفاده کنید و دلیلی وجود ندارد که این قسمت ها را خودتان سفارشی سازی کنید.
۲- Frame Timing Control
شما می خواهید بازی شما 60 فریم بر ثانیه اجرا شود ، بنابراین به نوعی تایمر و حلقه نیاز دارید که زمان به روز رسانی و رندر شدن را کنترل کند.
۳- ورودی
باید بتوانید به فشار دادن دکمه ها پاسخ دهید.
راههای مختلفی برای پاسخ دادن به فشار دادن دکمهها وجود دارد ، شاید بخواهید فقط بتوانید وضعیت فعلی یک دکمه را بررسی کنید ، یا شاید بخواهید رویدادها را ثبت کنید ، واقعاً مهم نیست.
SDL ورودی های دکمه را به شما گزارش می دهد ، اگر قبلاً از آن برای مقداردهی اولیه سیستم استفاده می کنید (همان بخش اولی که گفته شد) ، باید در اینجا نیز از آن استفاده کنید.
۴- رندرینگ
اکثریت بازی ها ، به نوعی از گرافیک برای پروسه ی رندرینگ استفاده می کنند و این کاملاً مسئولیتی است که باید به عهده موتور شما باشد.
اگر یک بازی دوبعدی انجام میدهید ، حداقل رندر فقط باید بتواند ی چهارتایی متریال دار ساده را روی صفحه نمایش دهد.
سایهزنها ، بافرهای رأس ، اهداف رندر ، مشها ، متریالها و … همگی عالی هستند ، اما میتوانند بعداً در صورت نیاز به آنها پردازشی صورت گیرد.
۵- ریاضی و ابزارهای کاربردی
این چیزی است که احتمالاً باید به عنوان یک کتابخانه ابزار داشته باشید که موتور و کد بازی هر دو به آن دسترسی دارند.
به علاوه هر توابع و فرمول مفید تصادفی دیگری که در هنگام توسعه پیدا می کنید.
STB یک منبع فوقالعاده عالی برای موارد کاربردی تصادفی است که ممکن است به آن نیاز داشته باشید.
۶- گیم آبجکت و مدیریت سکانس ها
اگر بازی شما حتی کمی پیچیده شود ، به نوعی سیستم می خواهید که آبجکت های بازی را کنترل کند که به عبارتی این مهم ترین سیستم در موتور شماست.
زیرا منطق بازی شما را به چه شکلی هدایت می کند.
- آیا آبجکت های شما درختان بزرگ ارثی هستند؟
- آیا آنها از اجزای کوچکتری تشکیل شده اند ؟
- آیا از ECS استفاده می کنید؟
- آنها به چه نوع رویدادهایی پاسخ می دهند ؟
- چگونه برای سایر آبجکت های برای تعامل با آنها پرفتار می کنید ؟
- آیا به چیدمان حافظه اهمیت می دهید ؟
اینها همه چیزهایی هستند که سیستم game object / scene management بازی شما باید پوشش دهد.
۷- بارگیری و مدیریت فایل
همه بازی ها باید فایل ها را بارگیری کنند.
شما به راهی برای بارگذاری فایل ها نیاز دارید.
احتمالاً نمیخواهید فایلهایی را که قبلاً بارگذاری شدهاند بارگذاری مجدد/رمزگشایی کنید ، بنابراین به نوعی basic manager نیاز دارید که همه اینها را مدیریت کند.
ممکن است بخواهید پشتیبانی مود یا dynamic loading/unloading یا هر چیز دیگری را ایجاد کنید ، تا زمانی که اصول اولیه را در اینجا داشته باشید و فقط فایل ها را از طریق فایل منیجیر بارگیری کنید ، می توانید به راحتی هر کارکرد دیگری را که می خواهید به این اضافه کنید.
۸- شبکه سازی
شبکه سازی (چند نفره آنلاین) بسیار اختیاری است و اگر بازی شما در سبک آنلاین باشد به کار می آید.
با این حال این یک سیستم بسیار دشوار است که شما باید تنها در صورت نیاز اقدام به پیاده سازی آن در موتور بازی سازی خود بکنید.
منابعی برای کمک به نوشتن موتور بازی سازی
اگر شمایی که در حال مطالعه ی این مقاله هستید ، یک برنامه نویس هستید و علاقه ی زیادی به ساخت یک موتور بازی سازی با تمامی تفاسیر گفته شده دارید ، قطعا منابعی که در ادامه به شما معرفی می کنیم ، می تواند به شما کمک کننده باشد.
Game Programming Patterns یک مطالعه عالی و نمونه ای عالی از نحوه نوشتن کتابی است که موضوعات دشوار را به شیوه ای مبتدی توضیح می دهد.
این کتاب یک نمای کلی در سطح بالایی از بسیاری از الگوهای طراحی ارائه می دهد که عمدتاً توسط موتورهای بازی و تیم های توسعه بازی استفاده می شوند.
این کتاب دستورالعملی در مورد نحوه نوشتن یک موتور بازی به شما ارائه نمیدهد ، اما تکههایی از کد الگوهایی را نشان میدهد که میتوان از آنها برای پاکتر کردن ، درک آسانتر و سریعتر کد بازی استفاده کرد.
یکی دیگر از مطالب عالی است که هم تئوری و هم عملی پروژههای موتور بازی C++ در مقیاس بزرگ را پوشش میدهد.
برخی از ریاضیات مهم توسعه بازی ، ابزارها ، زیرسیستم ها ، رندرینگ ، کالوژن ، فیزیک ، انیمیشن ، چند رشته ای و دیگر جنبه های نحوه پیاده سازی موتورهای بازی سازی را پوشش می دهد.
اگر یک توسعهدهنده بازی حرفهای هستید ، این کتاب باعث میشود تا درباره برخی از تصمیمات مهم معماری پروژههای بزرگ موتور بازی فکر کنید.
اگر از خواندن در مورد موتورهای بازی کلاسیک مانند id Tech 1 و Build لذت می برید ، از خواندن کتاب های Fabien Sanglard نیز لذت خواهید برد.
این مجموعه Game Engine Black Book نام دارد و اجرای بازی های Wolfenstein 3D و DOOM از id Software را پوشش می دهد.
این کتاب ویدیویی نقشه راه کامل نحوه کدنویسی یک موتور بازی کوچک دو بعدی با استفاده از C++، SDL و Lua را پوشش میدهد.
شما میتوانید یک سیستم Entity-Component-System (ECS) را از ابتدا کدنویسی کنید ، با استفاده از SDL ، حرکت ، انیمیشن ، کالوژن ، رویدادها رندر کنید ، ویجتهای ImGui را اضافه کنید و یاد بگیرید که چگونه زبان برنامهنویسی Lua را تعبیه کنید تا امکان نوشتن اسکریپت در موتور بازی خود را فراهم کنید.
اگر میخواهید با برنامهنویسی موتور بازی دوبعدی کوچک خود را درگیر کنید ، احتمالاً این کتاب نقطه ی خوبی برای شروع است.
مهرسا امینی
برنامه نویس ، انیماتور ، سئوکار
سختي هايی زندگيی سازنده ي زيبايی های اون هستش