مقدمه ای بر ECS در Unity
اولین باری که با ECS آشنا شدم توی یکی از نشست های Unity درباره نوشتن کد هایی با کارایی بالا بود. توی اون ویدیو صحنه بزرگی با کلی جزییات در حال پردازش بود، ده ها هزار اشیا با جزییات زیاد در حال حرکت به سمت همدیگر بودن. صحنه پر از جلوه های بصری سنگین بود ولی Unity به راحتی از پس اجرای چنان صحنه عظیمی بر اومده بود!
خب Unity چطور چنین کاری رو ممکن کرد؟
با باز نویسی کامل یکی از اصلی ترین قسمت های انجین.
باید گفت ECS تغییر بزرگی در نحوه کار با یونیتی بوجود خواهد آورد نتنها نحوه کار ما با یونیتی بلکه بخش زیادی از کد های انجین هم نیاز به بازنویسی دارن و احتمالا به کد سی شارپ تبدیل بشن.
از اونجایی که یونیتی ادعا می کنه اگه کد های سی شارپ رو با رویکرد ECS بنویسید سرعتشون از کدهای سی پلاس پلاس هم بیشتر میشه پس چندان هم غیر منطقی نیست اگه بخش زیادی از کد های انجین رو با سی شارپ دوباره بنویسن که خب برای ما خیلی خوب چون حالا استفاده کنندهای یونیتی و کسانی که یونیتی رو میسازن با زبان مشترکی کد ها شون رو می نویسن. نکته مثبت دیگه اینه که اون بخش هایی از انجین که با سی شارپ نوشته میشه از طریق Package Manager یونیتی در دسترس خواهد بود(البته برای کاربران Unity Pro).
با تمام این حرف ها حالا ECS چی هست؟
یک روش نسبتا قدیمی برای طراحی سیستم های نرم افزاری که یونیتی در روش سنتیش(GameObject+MonoBehavior) تقریبا از همین روش استفاده می کرد ولی نه با رویکرد داده گرا(Data Oriented).
این روش برای اولین بار در سال 1998 توی یه بازی به کار برده شد ولی تا سال 2007 طول کشید تا به چیزی که یونیتی در حال حاضر به عنوان ECS ازش یاد میکنه برسه.
در اصل ECS روشی است که یونیتی برای پیاده سازی مدل برنامه نویسی داده گرا بکار بسته و قبلا هم توسط شرک هایی مانند Dice و یا Naughty Dog مورد استفاده قرار گرفته پس میشه گفت امتحانش رو پس داده.
البته باید گفت که در یونیتی ECS به تنهایی کارایی رو چندان بالا نمیبره و برای اینکه تفاوت رو کاملا حس کنید باید از C# Job System و کامپایلری که بچه های یونیتی زحمتش رو کشیدن به نام Burst استفاده کنی تا از تمامی توانمندی های این سیستم بهره مند بشید.
کدام روش، Hybrid یا Pure؟
از اونجایی که ECS خط بطلانی بر روی روش سنتی پیاده سازی منطق بازی در یونیتی که بر اساس Game Object و MonoBehavior است می کشه، یه روش بینابینی هم معرفی می کنه که به روش Hybrid معروفه که بیشتر به درد کاربرانی می خوره که میخوان کدهای سنتی شون تبدیل به ECS کنن. نظر شخصیم اینه که روش Hybrid کمی پیچیده تر هست و روش Pure که کلا از المانهای ECS استفاده می کنه هماهنگی و سادگی بیشتری دارن.
پس اگه می خواین یه پروژه رو از اول شروع کنید روش Pure مناسبتر.
چقدر رو کارایی تاثییر داره؟
این تا حدود زیادی بستگی به این داره که چقدر پروژه ای که دارید میسازید از CPU استفاده می کنه و به قولی آیا پروژه CPU Bound هستش و یا GPU Bound. مثلا بازی هایی شبیه سازی و یا بازی های Real-time strategy که امکان داره استفاده زیادی از CPU داشته باشند بیشترین افزایش کارایی رو تجربه می کنن.
با توجه به آموزشی که یونیتی تهیه کرده باید گفت میشه هشت تا ده برابر افزایش کارایی رو بدست آورد. اگه روی اون آموزش کمی دقیق بشین متوجه میشین که درآخر کار GPU داشت با 100 درصد توان خودش کار میکرد ولی CPU فقط کمی بیشتر از 30 درصد. پس می شه به صورت نظری بگی که افزایش کارایی میتونست توی اون سیستم تا 30 برابر هم پیش بره اگه GPU قوی تری داشت.
پس استفاده از ECS رو بازی های کوچیک موبایلی تاثیری نداره؟
از اون جایی که بازی های کوچکتر موبایل معمولا GPU Bound هستن پس شاید افزایش فریم چندان زیادی رو تجربه نکنند ولی روی مصرف باطری و کمتر داغ شدن دستگاه می تونه تاثیر مثبت داشته باشه.
ایا از ECS برای پروژه جدیدمون استفاده کنیم؟
باید بگم که نه. در زمان نوشتن این مقاله ECS همچنان خیلی کار داره تا بشه توی یه پروژه جدی ازش استفاده کرد قسمت های زیادی از انجین نیاز به منطبق شدن با اون رو دارن و خود ECS هم در حالت Preview به سر میبره. ولی از الان باید به فکرش باشید. نظر شخصیم اینه که خیلی از توسعه دهنده ها خودشون رو درگیر ECS نمی کنن مخصوصا برای پروژه های کوچکتر.
در آخر باید گفت که از دیدگاه یک برنامه نویس ECS میتونه نحوه کار با یونیتی رو به کلی متحول کنه که باید بسته به پروژه ای که شروع می کنیم تصمیم بگیریم آیا ارزشش رو داره یا نه.
مطلبی دیگر از این انتشارات
چرا بازی های مستقل؟
مطلبی دیگر از این انتشارات
طراحی الگو در بازی های ویدیویی
مطلبی دیگر از این انتشارات
دانلود بازی آلترتانک با حجم 2 مگابایت