Комментарии 39
Проблема была не во float, а в накоплении ошибок округления. При правильном решении (получать системную отметку времени и вычитать начальное значение) точности float вполне хватило бы.
Подход "всюду используем только double" жрет много памяти и работает медленнее. А для того чтобы догадаться использовать double для таймера — надо знать про эту ошибку. Но тогда ничего не мешало бы и нормальное решение сделать.
Аналогично short int и char работают чуть медленней, чем intна современных машинах.
В любой 3D-игре таких мест должно быть полно. Чтобы знать что конкретно в этом месте double бы не помешал — нужно думать. А программист не думал.
Кроме того, движок и сама игра — чуть разные вещи и программируются зачастую разными людьми. А в самой игре (без движка) как-то не видно, где векторизация возможна.
Всё считают с помощью SSE.
Все эти ситуации решаемые если вспомнить математику.
затем сразу же в оригинальную переменную пишем значение нашей целочисленной переменной, умноженное на размер тика
Пишем или добавляем?
Вообще, у игры должны быть свои часы, согласно которым происходят все события. Эти часы должны быть целочисельными. Один цикл просчета состояния игры — один игровых тик часов. Потом эти тики пересчитываются в секунды согласно игровых правил.
При START_TIME близкому к 300000 секунд количество шагов было почти в два раза меньше, чем ожидалось. При START_TIME, большем магической константы 524288 программа переставала работать.
Если я правильно понимаю, дело не только в накоплении ошибок, но и именно в недостатке точности float.
Если бы ошибки не накапливались — точности float вполне хватило бы.
Стены используются в основном в NFSU2, в других частях это не дает такого сильного выигрыша. В основном, когда сбросить скорость касанием стены быстрее, чем тормозить, и угол выхода из поворота получается лучше.
Про вашу догадку с сокращением времени и касанием стен: опять же, доподлинно не известно, влияют ли конкретно столкновения, но такая тенденци была замечина. Вот это видео неплохо демонстрирует механику кетчупа в целом и касания стен в частности.
Забавнее была сама ситуация когда ты даешь другу фору, он смеется над тобой обгоняя на круг, едет выжимая максимум на своей машине, и ты проносишься мимо него на точно такой же и обгоняешь как стоячего(он смотрит на твою половину и видит ту же скорость что и у него), а спустя еще пару мгновений уже дишишь в спину, хотя он нигде не ошибался. Сложнее всего было именно вырваться, тк никаких слипстримов насколько помню тогда в физике игры не было и приблизившись на определенное расстояние к игроку на 1ом месте характеристики обоих игроков становились одинаковыми и оставалось надеться только на грубую ошибку игрока идущего впереди.
Ничего не хочу писать умного, просто поделюсь эмоциями:
Хабр — торт! Прочитал статью на одном дыхании.
Причем арифметических операций стоит избегать, даже над целыми числами.
int64 и наносекунды отлично подходят друг к другу. Во многих реализациях c++11 классы std::steady_clock и std::system_clock реализованы именно так.
Можно попытаться выносить обновление физики в отдельный поток и его насильно блокировать на 100фпс, но это уже значительно сложнее реализовать.
В итоге у нас есть 4 разных версии игры, которые надо поддерживать. Этот факт делает «правильный» путь чрезмерно сложным и неоправданным. По-хорошему, нужно слегка подправить запускаемый файл и обнулять счетчик там, но… Править 4 разных экзешника, которые еще и запакованы, да защищены от отладки… Лучше просто напишем простую программку, которая будет в реалтайме отслеживать состояние таймеров и обнулять их при необходимости.
На самом деле нет. Лучше сделать плагин, который загружается вместе с игрой без необходимости запускать какие-либо программы. А для поддержки разных экзешников у нас есть паттерны :)
Пример здесь и здесь.
Я, увы, сделал решение по мере своих сил и возможностей. Решении с Extra Options очень популярно в нашем коммьюнити, и изначально хотел делать через него, но… Extra Options вызывают ряд дополнительных проблем, с которыми мы столкнулись, и из-за которых сейчас стоит вопрос о запрете использования их в целом. Поэтому я преследовал цель оставить исходный код игры в самом минимально измененном варианте :)
Как EA усложнили нам жизнь, или как мы чинили баг 12-летней давности