ИМХО. Больше прострела богу прострела. Потому что если не дать прострел, привет лафет впитывающий неприлично много урона.
По предложению. Передавать урон по швам. Всё что превышает ХП детали, распределяется по прикрепленным пинам. Если урона получается меньше чем 1/пин - не наносить. Попутно даст эдакий микрорезист плотно лежащим панелям.
Хитскан кидает луч от орудия по вектору прицела.
Допустим, луч кидается каждые 0.33 секунды (3 тика в секунду - окей).
Итак, мы кидаем луч, в этот момент мы опрашиваем все объекты попадающие на луч, для удобства, длина луча фиксирована (т.к. хитскан орудия имеют конечную дальность).
Дальше возникает вопрос этой самой длины. Возьмем какие-нибудь сферические в вакууме 310 метров
(Почему 310? Мне так удобнее).
Отлично. Мы знаем конверсию пинов в метры (не суть важно какая она).
Дальше, привет поиск, для удобства, прямой. С шагом в 10 метров, нулевая точка - 5 метров от ствола.
На каждый шаг мы опрашиваем по 5 метров в каждую сторону, спрашивая “деталь есть?”. Спрашиваем с шагом в пин.
Исходя из на коленке видимых значений, метр это примерно 3-5 пинов. Соответственно на каждую процедуру поиска нам потребуется дополнительно 50 опросов (запомним это число).
Для отрезка в 310 метров нам потребуется сделать 30 шагов, что приведет нас к 1500 операциям по опросу в каждую сторону (исходя из того, что 1 пин ~20 см).
Отлично, 1500 операций, запомнили.
Для любой стрельбы это минимум. Вне зависимости от прострела.
Поскольку определяем мы в момент стрельбы и идем от ствола в среднем будет требоваться меньше операций (т.к. на предельную дистанцию лупят меньше).
В случае если нам требуется добавить прострел, мы точно так же, идем по лучу с шагом в пин, вплоть до предела в Х пинов, что добавляет к изначально найденному попаданию Х шагов.
То есть при стрельбе на 160 метров, для прострела в 15 пинов сложность расчета увеличится на 10%, относительно стандартного попадания.
И будет всё ещё меньше стокового просчета попадания.
Вывод? Прострел добавить максимально легко, привет трассировка лучей.
Допустим у нас 16 (!!!) игроков с 4 пулеметами каждый.
Они все стреляют.
Для каждого игрока требуется просчитать луч.
Как мы уже посчитали, предельная нагрузка 4500 (1500*3) операций на 1 ствол в секунду.
Всего у нас 64 ствола. 288000 операций.
Вывод? Движок говна, спасибо, расходимся.
Банальная дискретизация каста луча не до контакта, когда обсчитывается буквально каждый пиксель трехмерного матричного пространства, а с шагом в пин экономит дохуялиард расчетов.
Если исходить из стокового raycast, то после пробития, если урона хватило на то чтобы пробить деталь, мы снова вынуждены кастовать тот же луч, на предмет попадания в следующую деталь, передавая уже иной урон вместе с этим лучом.
Что как бы х2 требований по производительности, но никак не ограничивается по глубине, потому что луч.
Вывод? Движок говна, расходимся.
P.S.
Для справки, напомню, “частота” процессора обозначает количество проводимых операций в секунду и измеряется в ГГц. ГигаГерцы. Для тех кто в танке, гига - это МИЛЛИАРДЫ.
Т.е. буквально 1 серверный xeon, со своими 2.8 ГГц, сможет на 1 ядре (из 8/16) обсчитывать примерно тысячу одновременно шмаляющих групп по 16 (!!!) игроков с 4 пулеметами.
64000 пулеметов. Сомневаюсь что у кросса есть такой онлайн.
(Повторюсь. 1 ядро. Одного проца. Привет, оптимизация кода)
(Да, технически нужно чуть больше взаимодействий т.е. это как бы не 4500 операций на каждый луч, но ещё выделение памяти, нахождение вектора прицеливания, проведение по нему необходимых проверок, нанесение урона и т.д., что по факту снижает итоговую производительность в разы (а скорее всего в десятки раз), но тем не менее, алгоритмическими упрощениями код хитскана можно довести до крайне примитивного и простого, иной разговор, что это сложно реализовать, но камон:
Найти вектор по начальной и конечной точке - алгебраическое соотношение координат.
Пройти по этому вектору с шагом в Х - элементарно.
Определить что опрашиваемая единица пространства не является “пустой” (буквально поймать коллизию) - тоже довольно просто (для удобства все модели коллизий можно сводить к базовым кривым).
Хранить на сервере данные о том, где находится крафт игрока и какие на нем детали и так необходимо.
Вопрос реализации. Красиво разлетающиеся ошметками пепла детали после лазерного луча намного сложнее чем элементарная стрельба.