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

استفاده از dt در Every X seconds

کاربران زیادی آموزش «دلتاتایم و استقلال از نرخ فریم» را خوانده‌اند و از تکنیک‌هایش در پروژه‌هایشان استفاده می‌کنند (این آموزش انشاءالله به زودی ترجمه خواهد شد). امّا استفاده از dt (دلتاتایم) در کاندیشن Every X seconds ناشی از درک نادرست استقلال از نرخ فریم است.

ایونتی مثل Every 1 second به خودی خود مستقل از نرخ فریم است. این ایونت زمان را می‌سنجد، نه فریم‌ها را. در هر ثانیه یک‌بار اجرا می‌شود بدون توجّه به نرخ فریم. اگر نرخ فریم 10 FPS باشد در هر ثانیه یکبار اجرا می‌شود، اگر 60 FPS باشد هم در هر ثانیه یک‌بار اجرا می‌شود. این ایونت ربطی به نرخ فریم ندارد که بخواهد اصلاحش کنیم.

اتّفاقاً ایونتی مثل Every 60 * dt seconds وابسته به نرخ فریم است، برخلاف چیزی که می‌خواستید! در 10 FPS، مقدار dt برابر 0.1 است، بنابراین ایونت هر 6 ثانیه یک‌بار اجرا می‌شود. در 60 FPS، مقدار dt حدود 0.016 است، بنابراین ایونت هر 0.96 ثانیه یک‌بار اجرا می‌شود. پس این مقدار وابسته به نرخ فریم است، و این چیزی بود که می‌خواستیم جلوی آن را بگیریم.

از طرف دیگر، اگر تنظیم کنیم که در هر تیک، شیئی یک پیکسل حرکت کند، این حرکت وابسته به نرخ فریم است، چون سرعت حرکت شیء به نرخ فریم بستگی دارد: در 30 FPS با سرعت 30 پیکسل بر ثانیه و در 60 FPS با سرعت 60 پیکسل بر ثانیه حرکت می‌کند. در این‌جا، می‌توان از dt استفاده کرد تا شیء با سرعت ثابت حرکت کند. dt زمان سپری شدن یک تیک است، بنابراین اگر شیئی را در هر تیک 60*dt پیکسل حرکت دهیم، آن شیء در هر ثانیه 60 پیکسل حرکت می‌کند، خواه نرخ فریم 30 FPS باشد، خواه 60 FPS یا هر چیز دیگر. این هدف واقعی اکسپرشن dt است. از این اکسپرشن در ایونت‌هایی که خودشان مستقل از نرخ فریم هستند استفاده نکنید.

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

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

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

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