سالار ندایی
سالار ندایی
خواندن ۵ دقیقه·۲ سال پیش

یونیتی و worker ها


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

تاریخچه :

قبل از توضیح در مورد ورکرها ( workers ) بهتره کمی در مورد این تاریخچه و علت وجود رو بحث کنیم , (همچنین می توانید  مبحث فراریسمانی در ویکی پدیا را هم میتوانید مطالعه نمایید ).


  • در سال 1981 شرکت مایکروسافت یه سیستم عامل جدید با نام MS-DOS معرفی میکنه که در واقع که کارکردی شبیه به cmd ویندوز داشت به این صورت که دستور رو وارد میکردیم و یه result رو نمایش میداد و به نوعی در این سیستم عامل فقط قادر به انجام یک کار بودیم یعنی موقعی که سیستم عامل در حال پردازش دستور وارده بود هیچ دستور جدیدی نمی توانستیم به آن دهیم , به این نوع پردازش single processing میگویند .
  • چند سال بعد در سال 1988 شرکت مایکروسافت ویندوز 98 رو معرفی کرد که دارای یک قابلیت جدید به نام Yield ( اولین حضور مفهومی به نام yield در دنیای کامپیوتر ) بود , امروزه ما از yield در متدهای coroutine استفاده میکنیم , در واقع کاری که yield انجام میده اینکه یک پردازش رو تا جایی که ما بخواهیم انجام میدهد و در وسط کار اونو رها میکنه و بعد از زمان و یا فریم خاصی دوباره فرایند پردازش قبلی رو ادامه میده , حال این مورد برای مواقعی که ما نیاز به چک کردن یک حلقه بسیار طولانی داریم بسیار مفید بوده و باعث میشه که منابع سیستم فقط برای یک حلقه مصرف نشه .
  • در واقع این کار اولین شبیه سازی مولتی تسکینگ در زمان خود بوده است , البته این کار فقط مولتی تسکینگ رو شبیه سازی میکرد و در واقع تمام پردازش ها در main thread (ترد و تسک اصلی برنامه )  انجام می شد.
  • در سال 2000 هم یه ویندوز به اسم ویندوز 2000 توسط شرکت مایکروسافت معرفی شد که قابلیتی مشابه ویندوز 98  داشت با این تفاوت که شما قادر به pause و resume کردن تسک ها بودید , که این مورد هم در واقع جعل کردن مولتی تسکینگ بود و هنوز راهکار مناسبی حساب نمیشد .
  • دلیل اصلی بوجود آمدن روش های فوق این بود که در اون زمان cpu ها فقط یک هسته داشتند .
  • در سال 2000 شرکت intel و AMD اولین cpu های چند هسته ای خودشون رو معرفی میکنند .
  • بعد از مدتی شرکت اینتل میاد و یه قابلیتی رو معرفی میکنه به اسم هایپرتردینگ که کارکردش به این صورت بود که یک پروسس رو به چند thread تقسیم میکرد و می فرستاد به هسته های سی پی یو و بعد از اتمام پردازش اونها رو به main thread برمیگرداند , در واقع اینتل اولین روش استفاده از هسته های سی پی یو رو به برنامه نویسان معرفی میکنه که انقلابی در نوع خود بود و تاثیر بسیار زیادی در سرعت نرم افزار ها داشت .

مزایا و معایب :

این روش هم مانند تمام روش ها مزایا و معایب خودش رو داره به مثال زیر توجه کنید

فکر کنید ما قراره a+b کنیم و نتیجه رو در c ضرب کنیم برای افزایش سرعت این پروسس ما جمع شدن a و b رو به یک ترد و ضرب شدن نتیجه در c رو به یک ترد دیگه میدهیم , این کار باعث افزایش سرعت بسیار زیاد برنامه ما میشه و تا اینجای کار اوکی هست یعنی موقع اجرای برنامه مون اول ترد جمع کردن اجرا میشه و بعد ترد ضر که کاملا درسته ولی اگر موقع اجرا شدن اول ترد ضرب شدن اجرا بشه و بعد جمع کردن ! مشکل ساز خواهد بود , حالا این مشکل رو تو سیستم ها و زبان های مختلف با راههای مختلف حل میکنن که بسته به هر سیستم و بر اساس نیاز نوشته میشه .

آشنایی با Task ها :

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

برای استفاده از از کلاس task نیاز دارید تا کد using system.threading را به کدهای خود اضافه کنید .

به مثال زیر دقت کنید :

void Start(){

Task task = Task.Run(() => do_());

}

void do_(){

// do

}

در مثال فوق ما متد _do را که یک متد ساده هست رو با استفاده از Task ها فراخوانی میکنیم که همین عمل باعث میشه کلاس Task متد _do رو روی یک ترد از سی پی یو دیوایس اجرا کنه و از انجایی که کلاس Task خودش کارهایی مانند مدیرت نخ های سی پی سو و … را به صورت اتوماتیک مدیریت میکند دیگر نیازی به انجام کار خواصی نیست .

کاربرد اصلی این روش بیشتر برای انجام پردازش های سنگین هست مخصوصا اگر میخواهید زمان پردازش رو کوتاه تر کنید بسیار مناسبه , این روش اصلی استفاده از چندوظیفگی در سی شارپ هست که روی یونیتی هم قابل اجراست , البته یونیتی روش جدیدتری هم برای انجام این عمل داره به اسم ECS که طبق اخرین تست ها تا چندین برابر سریعتر از روش فوق هست ولی پیاده سازی اون به راحتی متد فوق نیست و سختی ها و ارور های خاص خودش رو داره ( البته اینم داخل پرانتز اضافه کنم ECS رو بنده هنوز وقت نکردم یادبگیرم ) و مطمعنا در آینده ای نه چندان دور احتمال داره ECS کمی ساده تر و قابل فهم تر باشه تا بشه روی تمام بازی ها اون رو پیاده کرد.

امیدوارم این نوشته بتونه کمکی برای شما باشه و درصورتی که مایلید تا مقاله ها رو کمی حرفه ای تر کنیم حتما توی نظرات اعلام کنید چون معمولا سعی من بر اینکه تا مقاله هام رو به عامیانه ترین حالت ممکن بیان کنم تا درکش برای همه سطوح راحتتر باشه و البته اینم اضافه کنم که خودم هم همیشه مطالب رو با روش درک مطلب به ذهن میسپارم که اینم یک دلیل دیگه برای این نوع نوشتن هست , اگر سوالی دارید بپرسید درصورتی که درتوانم باشه حتما کمک میکنم.

سوالات مربوط به این مقاله رو میتونید در اینجا ( https://rosedev.ir/unityandworkers ) بپرسید.

موفق باشید.



cpuunitytaskبازی سازی
مرجع اموزش بازی سازی با یونیتی https://rosedev.ir
شاید از این پست‌ها خوشتان بیاید