raic-2019 icon indicating copy to clipboard operation
raic-2019 copied to clipboard

Иногда при приземлении происходит "тупняк" на 1 микротик.

Open tyamgin opened this issue 5 years ago • 15 comments

Карта дефолтная.

Псевдокод стратегии:

        if (currentTick == 0) {
            // do nothing
        } else {
            action.jump = true;
            if (currentTick == 67 || currentTick == 68) {
                std::cout << unit.position.y << std::endl;
            }
        }

1.00333 1.16167

Суммарное передвижение равно (1.00333 - 1) + (1.16167 - 1) = 0.165, что не соответствует заявленным 10 / 60 = 0.16666666 (т.к. скорости падения и прыжка равны).

Другой пример, где всё ожидаемо:

        if (currentTick == 0) {
            // do nothing
        } else if (currentTick == 1) {
            action.velocity = 10;
        } else {
            action.jump = true;
            if (currentTick == 52 || currentTick == 53) {
                std::cout << unit.position.y << std::endl;
            }
        }

1.06667 1.1

(1.06667 - 1) + (1.1 - 1) = 0.16667

В чате написали, что это нормально, но я так не считаю. Хотелось услышать мнения.

tyamgin avatar Dec 01 '19 18:12 tyamgin

Мнение: это ненормально.

prospero78 avatar Dec 02 '19 04:12 prospero78

Итак, я запустил в режиме {"ticks_per_second": 6000, "updates_per_tick": 1}.

Лог первой игры (microtick, y):

6701 1.0016666676667
6702 1.0000000010000
6703 1.0000000010000
6704 1.0016666676667

Лог второй игры:

5239 1.0016666656667
5240 1.0000000010000
5241 1.0016666676667

В первом случае мы засыпаем 1 раз на y=1.

В чём отличие этих двух кейсов? В том, что в первом время прыжка закончилось, и canJump, соответственно, стал fasle, а во втором время ещё есть, и и canJump=true. На переключение canJump с false на true тратится 1 микротик, что абсолютно не логично, и является багом в движке (так как это в правилах не указано). Предлагаю исправить.

tyamgin avatar Dec 02 '19 16:12 tyamgin

Это из-за того, что при ударе об стену, игрок отодвигается от стены на EPS = 1e-9. В результате сначала игрок на земле, его координата больше целого на EPS, а когда ударяешься об потолок, то меньше целого на EPS, это и приводит к тому, что в первый раз когда высота стала почти нулевой, удар об землю не засчитывается и флаги не меняются, во второй раз уже происходит удар сразу.

Лучше механику игры не менять, так как может все сломать, плюс некоторые люди уже зареверсили то, как работает сейчас.

ud1 avatar Dec 02 '19 17:12 ud1

В один апдейт игровой логики движение происходит лишь один раз. Если юнит вплотную к земле и падает вниз, он упрется в нее, и перейдет в состояние прыжка. Сам прыжок будет происходить лишь в следующий апдейт

kuviman avatar Dec 02 '19 20:12 kuviman

Да я уже благодаря @ud1 понял, что y+eps и y-eps - это разные координаты. Это очень тупо, и непрерывность движений сломана. Но что поделать, остаётся смириться.

tyamgin avatar Dec 02 '19 22:12 tyamgin

Как раз благодаря eps при отскоке от стен ошибки округления почти нигде себя не проявляют (кроме самого начала игры, когда игрок выставляется по круглым координатам). Хотя стоило бы размеры юнита сделать менее круглыми.

MrSmile avatar Dec 03 '19 13:12 MrSmile

Ничто не мешает мне сдвинуться на 1e-9, и костыль перестанет работать (принадлежность тайлам станет неопределенной). И да, хотя бы в начале игры сдвинули бы на 1e-9 уже.

tyamgin avatar Dec 03 '19 17:12 tyamgin

Как раз благодаря eps при отскоке от стен ошибки округления почти нигде себя не проявляют (кроме самого начала игры, когда игрок выставляется по круглым координатам). Хотя стоило бы размеры юнита сделать менее круглыми.

После фикса телепортов, кажется, стали проявлять - выталкивает теперь на min(1e-9, старое_расстояние_до_сдвига)

mortido avatar Dec 04 '19 14:12 mortido

После фикса телепортов, кажется, стали проявлять - выталкивает теперь на min(1e-9, старое_расстояние_до_сдвига)

Мдя... с такими "фиксами" никаких багов не надо. Раньше проблема была только на нулевом тике, а теперь, вместо того, чтобы ее решить добавлением 1e-9 к начальной координате, ее растянули на неопределенное время (кажется, надо башкой стукнутся, чтобы прошло).

MrSmile avatar Dec 04 '19 18:12 MrSmile

Такие изменения никуда не годятся. В каких случаях теперь отнимается/прибавляется эпсилон? При приземлении на земле на старте эпсилон не прибавляется, при приземлении на платформу где-то дальше - прибавляется. Раз пошла такая пьянка, надо убирать вообще эпсилоны.

tyamgin avatar Dec 04 '19 18:12 tyamgin

Раз пошла такая пьянка, надо убирать вообще эпсилоны.

Нельзя, все величины слишком круглые и делятся нацело друг на друга, будет только хуже. Изначальный вариант, в принципе, неплох (лучше только переписать всю физику на целые числа), за исключением начального значения.

MrSmile avatar Dec 04 '19 18:12 MrSmile

Почему нельзя? Чтобы проверить на коллизию со стеной, нужно прибавить/отнять (в зависимости какую сторону проверяем) к координате eps, и проверить получившуюся ячейку. Хранить этот eps уже приплюсаванным к координате - это мегакостыль, а потом ещё выдавать это наружу.

tyamgin avatar Dec 04 '19 18:12 tyamgin

Где конкретно хранить eps, явно в координате или неявно в положении стены, — это без разницы. Важно, чтобы координата проверки на пересечение отличалась от координаты отскока.

MrSmile avatar Dec 04 '19 18:12 MrSmile

Как минимум разница в том, что это сбивает с толку. Проверка на равенство предположительно целого float-числа c интом - это внутренняя кухня движка, и я не хочу видеть артефакты её работы в виде непонятного смещения, тем более, что это смещение потом на что-то ещё повлияет.

tyamgin avatar Dec 04 '19 19:12 tyamgin

Не понимаю, почему упарываются настолько. Смысл соревнования в написании ИИ, который ориентируется и побеждает в игре, а не в таком tryhard'e, что все пытаются устроить :-( Реверсят ещё что-то... как будто так интереснее играть

StarveTheEgo avatar Dec 05 '19 16:12 StarveTheEgo