اشنایی با DOTS و توضیح علمکرد این تکنولوژی در انجین unity

در این مقاله سعی کردم تا سیستم DOTS رو به صورت خلاصه و ساده توضیح بدم.

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


اول از همه لازمه سخت افزار رو مورد بررسی قرار بدیم


در سیستم های امروزی CPU سرعت بسیار بالایی رو داره که میتونه تعداد زیادی از دستورات رو اجرا بکنه مشکل از اونجا شروع میشه که CPU باید به اطلاعات دسترسی پیدا بکنه تا بتونه اونارو اجرا بکنه.

این دستورات و اطلاعات به طور دائمی در سخت افزار هایی مثل Hard Disk و SSD که رایج ترین هستند ذخیره میشه از اونجایی که این نوع سخت افزار ها (بسته به نوع و کلاس) سرعت کمی در تبادل اطلاعات دارند برای همین از یک حافظه میانگین برای نگهداری اطلاعات استفاده میشه که به اون RAM گفته میشه RAM سرعت بیشتری در خواندن و نوشتن نسبت به بقیه سخت افزار های ذخیره اطلاعات داره اما بر خلاف بقیه در این سخت افزار با قطع شدن برق اطلاعات پاک میشند.

رم (RAM) وظیفه میانجی گر رو در افزایش سرعت خواندن اطلاعات ایفا میکنه ولی بازم در مقابل قدرت و سرعت CPU سرعت زیادی نداره برای همین از یک حافظه میانجی دیگه ای هم برای نگهداری دستورات و اطلاعات استفاده میشه که cache نام داره این نوع حافظه ها بیشترین سرعت رو دارند و در داخل CPU قرار دارند که بسته به نوع CPU سطح بندی و حجم ذخیره سازی متفاوتی دارند مهم ترین دلیل عدم استفاده از نوع حافظه برای کار های دیگر مثل ذخیره سازی قیمت بالای این نوع حافظه ها هست.

در کامپیوتر های امروزی با اجرا شدن برنامه اول cache بعد RAM برای موجود بودن اطلاعات بررسی میشوند در صورتی که اطلاعات در هیچکدام از این واحد ها نباشد اطلاعات و دستورات مورد نیاز برنامه در RAM بارگذاری میشوند و دستوراتی که در حال اجرا هستند در حافظه های cache بارگذاری میشوند تا در CPU پردازش شوند.

دلایل ایجاد DOTS

همانطور که گفته شد اطلاعات در نهایت در cache ها بارگذاری میشوند تا در CPU اجرا شوند اما تنها دستوری که قرار است اجرا شود در cache ها بارگذاری نمیشود بسته به نوع سیستم عامل و معماری ها اطلاعات و دستورات چند بلاک بعدی هم در cache ها بارگذاری میشود تا در صورت نیاز CPU این دستورات زودتر و بهینه به واحد های پردازش رسیده و عمل پردازش بر روی انها صورت بگیرد.

در سیستم فعلی monobehaviour یونیتی اطلاعات به صورت پراکنده در RAM بارگذاری میشوند و در هر بار تغییر CPU در صورت موجود نبودن اطلاعات در cache ها مجبور است تا RAM را برای اطلاعات بررسی بکند تا اطلاعات مورد نیاز خود را پیدا بکند.

اما در سیستم DOTS این اطلاعات در کنار هم جایگیری میشوند و با اینکار امکان بارگذاری شدن اطلاعات مورد نیاز بعدی CPU بالا میرود و در نتیجه سرعت پردازش بالا میرود.

حالت مونو (بالا) و داتس (پایین)
حالت مونو (بالا) و داتس (پایین)


تکنولوژی DOTS چیست؟

کلمه DOTS مخفف کلمات Data Oriented Tab Stack می باشد که شامل زیر شاخه هایی برای استفاده بهینه و حداکثری از سخت افزار برای اجرای بازی ها می شود.

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

  • C# job system :

وظیفه multithread کردن کد ها را به عهده دارد که با استفاده از API جدید DOTS و این سیستم میتوان بدون درگیر شدن با پیچیدگی های چند هستگی و مشکلات مدیریت ان کد هایی نوشت که بر روی همه هسته های سخت افزار هدف اجرا می شوند در نتیجه میتوان از همه قدرت CPU نهایت استفاده را برد.

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

  • Entity component system:

این سیستم شامل جایگیری اطلاعات در RAM که در بالا به ان اشاره شد می باشد که خود شامل سه بخش است:

1.Entity:

همانند GameObject های معمولی می باشد با این تفاوت که فقط اطلاعات مخصوص خود را نگه میدارد.

2.Components:

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

متغییر ها و داده ها در این قسمت به صورت دسته بندی شده و در فایل های جداگانه نوشته میشوند مانند متغییر های لازم برای یک گونه خاص از دشمن های موجود در بازی.

3.Systems:

شامل دستوراتی است که بر روی هر Component تغییراتی ایجاد می کند که این دستورات شامل دستورات Update و ... می شود.

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

  • Burst compiler:

همونطور که از اسمش معلومه یه کامپایلر مخصوص هستش که این کامپایلر برای سیستم هایی که به وسیله monobehaviour نوشته میشن هم کارایی داره این کامپایلر کد های C# نوشته شده در یونیتی رو به کد های اسمبلی و ماشین تبدیل میکنه با یه ویژگی خاص که بسته به دستگاه خروجی (مانند اندروید یا کامپیوتر) بهینگی های مخصوص اون دستگاه رو هم لحاظ میکنه.




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


قسمت دوم: اشنایی با DOTS در یونیتی entity spawn