по себе? Логика такая, что каждый тик проверяется, прошло ли какое-то время, вместо того чтобы проверить один раз по истечении этого времени. Для чего это было сделано?
а как проверять по истечении этого времени?
Поставить будильник
Потому что игровая логика в одном потоке и обработка тиков идёт в тот же фрейм что и обработка событий таймеров и делеев
Это понятно, но почему сделано именно так? Таймеры/делеи могут просто поставить Sleep на какое-то время и после продолжить работу. Если требуется не блокировать поток, то можно саму задержку поставить на другом потоке, а для синхронизации использовать мьютексы. Намного более быстрый вариант, чем просто каждый тик проверять таймер
хм, ты предлагаешь на каждый таймер создавать поток со своим Sleep, просто что-бы потом дернуть делегат?)
Это так не работает так как мьютексы это весьма недешево, иначе lockless бы не городили. Обычно делают один планировщик, который вычисляет когда следующий таймер и спит до этого момента, а потом вызывает все делегаты стопкой и считает когда следующий раз просыпаться
Ну или так, но в движке все на тике стоит. Есть аналог планировщика, но он так же устроен так, что нужно тикать каждый кадр
Обсуждают сегодня