Статья
Раздел:
Разное
Приветствую, Вас - хейтеры рефорджа, сегодня на вашей улице праздник, ибо недавно мною был обнаружен просто отвратительный баг, баг связанный с замедлением времени внутренних таймеров спустя реально пройденное время.

Суть бага

Как видите через 10 минут таймеры стрелок начинают отставать, вы подумаете, что это невозможно, а вот возможно, скажу я и построил таблицу ускорения всех таймеров она приблизительная, но что я могу сказать, что время замедляется практически равномерно до 30 минуты, потом происходит резкое выравнивание и опять замедление
раскрыть
function BugSpeed()
    local table = {
        1,
        0.998,
        0.997,
        0.996,
        0.995,
        0.994,
        0.993,
        0.992,
        0.991,
        0.99, --10
        0.989,
        0.988,
        0.987,
        0.986,
        0.985,
        0.98,
        0.978,
        0.978,
        0.978,
        0.978, --20
        0.976,
        0.975,
        0.975,
        0.975,
        0.975,
        0.975,
        0.975,
        0.98,
        0.99,
        1, --30
        0.997,
        0.995,
        0.994,
        0.993,
        0.992,
        0.991,
        0.99,
        0.99,
        0.99,
        0.989, -- 40
        0.988,
        0.987,
        0.986,
        0.985, --45
    }
    local t = 0
    local k = 1
    TimerStart(CreateTimer(), TIMER_PERIOD64, true, function()
        t = t + TIMER_PERIOD64
        if t >= 60 then
            --print("скорость игры изменена на "..table[k])
            t=0
            DelayPerTime=table[k]
            k=k+1
        end
    end)
end
Я очень надеялся, что дело в моих кривых руках, но как бы я не переделывал систему, всё так же замедлялось, я проверял:
  • на одиночных таймерах
  • складывал инты на математическом таймере
  • делал да вейтах
  • проверял на джассе
  • проверял на сд графике
  • делал на полностью чистой карте
ПРОБЛЕМА НЕ НАБЛЮДАЛАСЬ ТОЛЬКО НА 1.26
не проверял только на промежуточных патчах типа 127, 128, 129, 131, они слишком не ходовые чтобы вообще их трогать.

График замедления всегда разный

Это не возможно адекватно использовать, потому что замедление происходит в сотых или же тысячных и оно абсолютно рандомно, с этим никак нельзя работать, мне пришлось сделать среднее ускорение, и это порою может сломать игру, потому что я никак внутренними средства варкарфта не могу просчитать это.
Примерно на 27 минуте замедление находится на своём пике и составляет 2,5% это нереально много, таймер в 600 секунд запущенный на 17 минуте, зазвонит не на 27 минуте а на 27 минуте 15 секунде реального времени, хотя Варкрафт будет думать, что всё норм. это колоссально много ЭТО НЕРЕАЛЬНО ПЛОХО.
Но опять таки, если бы не музыка, скорость которой не меняется, баг бы не был обнаружен, и угораздило меня делать музыкальную игру в рефе =(, всем спасибо.
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
38
Lasto4ka, норм идея, а что во время паузы, норм работает?
33
Была идея сравнивать с реальным os.time там число и это работает на луа в рефе, скорее всего сравнение с GetTimeOfDay тоже фигня полная, но я это так и не проверил, потому что утратил интерес к данной теме.
24
А это все еще воспроизводится? Вроде что-то такое чинили как один из сточников десинков в долгих матчах.
В целом, как я понимаю, это шалит внутренний счетчик тактов для игровой логики, который по какой-то причине (догадываюсь по какой, но не скажу) перестал попадать в реальное время с достаточной точностью. А музыка воспроизводится без привязки к тактам игровой логики и вобще скорее всего в отдельном потоке, вот и обнаруживается несоответствие.
33
А это все еще воспроизводится?
Да кто его знает, нет необходимости проверять это
25
Была идея сравнивать с реальным os.time там число и это работает на луа в рефе, скорее всего сравнение с GetTimeOfDay тоже фигня полная, но я это так и не проверил, потому что утратил интерес к данной теме.
os.time() же в секундах возвращает, тогда уж лучше os.clock(), перспективный вариант для фикса мог бы быть
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.