Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
tyamgin opened this issue Dec 1, 2019 · 15 comments

Comments

@tyamgin
Copy link

tyamgin commented Dec 1, 2019

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

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

        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

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

@prospero78
Copy link

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

@tyamgin
Copy link
Author

tyamgin commented Dec 2, 2019

Итак, я запустил в режиме {"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 микротик, что абсолютно не логично, и является багом в движке (так как это в правилах не указано). Предлагаю исправить.

@ud1
Copy link

ud1 commented Dec 2, 2019

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

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

@kuviman
Copy link
Collaborator

kuviman commented Dec 2, 2019

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

@tyamgin
Copy link
Author

tyamgin commented Dec 2, 2019

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

@MrSmile
Copy link

MrSmile commented Dec 3, 2019

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

@tyamgin
Copy link
Author

tyamgin commented Dec 3, 2019

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

@mortido
Copy link

mortido commented Dec 4, 2019

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

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

@MrSmile
Copy link

MrSmile commented Dec 4, 2019

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

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

@tyamgin
Copy link
Author

tyamgin commented Dec 4, 2019

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

@MrSmile
Copy link

MrSmile commented Dec 4, 2019

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

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

@tyamgin
Copy link
Author

tyamgin commented Dec 4, 2019

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

@MrSmile
Copy link

MrSmile commented Dec 4, 2019

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

@tyamgin
Copy link
Author

tyamgin commented Dec 4, 2019

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

@StarveTheEgo
Copy link

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants