سلام دوستان , اول از همه من یه عذرخواهی کنم بابت تاخیر در نوشتن این مقاله بهانه ای نمیارم و فقط این رو عرض کنم که این مقاله هیچ منبع خاصی نداره و بیشتر حاصل تجربه است و امیدوارم که برای علاقه مندان این رشته مفید باشه و سطح مقاله هم پیشرفته یا حرفه ای هست ولی تا جایی که امکانش باشه سعی میکنم از توضیحات ساده تر برای شرح اون استفاده کنم .
تاریخچه :
قبل از توضیح در مورد ورکرها ( workers ) بهتره کمی در مورد این تاریخچه و علت وجود رو بحث کنیم , (همچنین می توانید مبحث فراریسمانی در ویکی پدیا را هم میتوانید مطالعه نمایید ).
مزایا و معایب :
این روش هم مانند تمام روش ها مزایا و معایب خودش رو داره به مثال زیر توجه کنید
فکر کنید ما قراره 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 ) بپرسید.
موفق باشید.