اشتباهات رایج در استفاده از ایونت‌های کانستراکت 2

حلقه‌ی For-each غیر لازم

در بسیاری از مواقع حلقه‌ی For-each خیلی مفید است، امّا اغلب درجایی استفاده می‌شود که تغییری ایجاد نمی‌کند. نحوه‌ی عملکرد ایونت‌ها به این صورت است که ابتدا کاندیشن‌ها برای تک‌تک اینستنس‌ها بررسی می‌شوند و بعد اکشن‌ها برای هر اینستنسی[1] که آن شرط برایش برقرار باشد اجرا می‌شوند. پس طبق این جمله، موتور کانستراکت 2 از قبل یک حلقه‌ی for-each به صورت خودکار دارد، تا به شما کمک کند ایونت‌ها آن طور که انتظار دارید عمل کنند. برای مثال ایونت زیر را در نظر بگیرید:

حلقه‌ی foreach داخلی

کانستراکت 2 اینگونه ایونت بالا را اجرا می‌کند: برای هر هیولایی که دارد شکار می‌شود، زاویه‌اش را به سمت مکان پلیر تنظیم کن. با این حال گاهی می‌بینیم بعضی‌ها از ایونتی مشابه زیر استفاده می‌کنند:

استفاده‌ی اشتباه از foreach

در این مورد استفاده از حلقه‌ی For each زاید است. این نشان‌دهنده‌ی فهم نادرست از نحوه‌ی عملکرد ایونت‌های کانستراکت 2 است. این کار اصلاً معنای ایونت را تغییر نمی‌دهد، کانستراکت 2 به صورت خودکار این را انجام می‌دهد. این کار دو عیب دارد: اوّلاً این‌که استفاده از ایونت‌هایی که اثری در بازی نمی‌گذارند گیج‌کننده است، ولی نگرانی اصلی در این مورد عملکرد بازی است. حلقه‌ی for-each داخلی خود کانستراکت 2 در سطح جاوااسکریپت به طور مستقیم اجرا می‌شود؛ حلقه‌های for-each که در ایونت‌شیت بازی وجود دارند نیز روی آن اجرا می‌شوند، که باعث می‌شود پردازش CPU بسیار بیشتر شود، در حالی‌که سازندگان کانستراکت 2 به سختی کار کرده‌اند تا بازی را بهینه کنند، این کار زحمات‌شان را بر باد می دهد، پس در مواقع غیر ضروری اصلاً نباید از for-each استفاده کرد.

پس کی از حلقه‌ی for-each استفاده کنیم؟ فقط وقتی که حلقه‌ی خود انجین به تنهایی کافی نباشد، معمولاً زمانی که می‌خواهیم همه‌ی اکشن‌ها به ازای هر کدام از اینستنس‌ها به طور جداگانه اجرا شوند، نه فقط اکشن‌های مربوط به آن شیء. اغلب زمانی از این حلقه استفاده می‌کنیم که می‌خواهیم کاندیشن‌ها یا اکشن‌های سیستمی به ازای هرکدام از اینستنس‌ها یک‌بار اجرا شود (که در حالت عادی کلّاً یک‌بار اجرا می‌شوند، زیرا فقط یک اینستنس از شیء System وجود دارد). برای مثال، اگر در ایونت بالا یک اکشن سیستمی برای کم کردن مقدار یک متغیّر اضافه کنیم (Subtract from)، افزودن for-each به آن، عملکرد ایونت را تغییر می‌دهد. بدون این حلقه، هر وقت که ایونت اجرا شود، بدون توجّه به این‌که چند اینستنس از هیولا پیک شده‌است، فقط یک بار از مقدار متغیّر کم می‌شود؛ با وجود این حلقه، آن اکشن سیستمی به ازای هر کدام از هیولاها یک‌بار اجرا می‌شود، یعنی کم شدن مقدار متغیّر به تعداد هیولاهایی که پیک شده‌اند بستگی دارد. مطمئناً در این‌جا این حلقه مفید است، امّا مواردی که در آن‌ها استفاده از حلقه‌ی for-each مفید است خیلی کم تر از آن است که کاربران فکر می‌کنند. در اغلب موارد نیازی به استفاده از این حلقه نیست.

[1] این عبارت، حلقه‌ی For each instance به معنی «برای هر اینستنس» را تداعی می‌کند.

سؤالات فنی خود را فقط در انجمن بپرسید. در غیر این صورت پاسخ داده نخواهد شد.
۴ نظر

افزودن دیدگاه

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

تمامی حقوق برای مرجع تخصصی کانستراکت محفوظ است.