есть одна 2D карта (по зеленой кнопке)
но код для просчёта коллизий может обработать только 11 юнитов
(если играть всемером - то получится, что можно добавить только 4 доп.юнита на карту)
если сделать 12 или 50 юнитов - то варик просто захлёбывается
(в карте есть счетчик обработки коллизий - максимально 80000 операций в секунду)
есть желающие поковыряться в коде и улучшить его, чтобы он смог обрабатывать 50 юнитов?
коллизии - это столкновение. по X это толкание соседних юнитов вправо влево, по Y это носить на голове или стоять сверху на юните
код карты тут:
EN controlc.com/b12ac4e8
RU controlc.com/dcfc0814
цепочка функций по просчёту коллизий:
main - начало карты
Frame__init - инициализация кадра
Frame__Main - просчет одного кадра (частота 0.02)
Frame__PlayersGroup - просчет группы юнитов
Frame__SquaresMoving - движение юнитов
Frame__MovingY [b==false] - движение по Y
if MushroomMoving_RectCondition "UpWidthOM" + "DownWidthOM"  - сравнение ректов
MushroomMoving_CollisionCheck - проверка на коллизии
set otherx=GetUnitX(OrangeMushroom[j]) + set othery=GetUnitY(OrangeMushroom[j]) - считывание координат
графики:
скриншот карты:
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
1
8
7 месяцев назад
1
Попробуйте проверять на коллизию не всех юнитов на карте а только ближайших, например через поиск их в ректе.
3
29
7 месяцев назад
3
Что такое CPS?

есть желающие поковыряться в коде и улучшить его, чтобы он смог обрабатывать 50 юнитов?
Ковыряться в чужом коде после грязного жасса? Извольте.
0
14
7 месяцев назад
Отредактирован host_pi
0
goodlyhero: Попробуйте проверять на коллизию не всех юнитов на карте а только ближайших, например через поиск их в ректе.
а разве именно это не делает эта имеющаяся строка в коде?:
if ContainsCoords(otherx-64,othery-64,otherx+64,othery+64,x,y)==true then
более того - если эту проверку убрать и оставить только считывание координат всех юнитов - то скорость особо не изменится, т.к. тормоза идут именно из-за считывания координат, которые потом сравниваются - близко они или далеко
nazarpunk: Что такое CPS?
счётчик количества отработки функции MushroomMoving_CollisionCheck
варик начинают загружать именно эти две строки:
set otherx=GetUnitX(OrangeMushroom[j])
set othery=GetUnitY(OrangeMushroom[j])
а счётчик считает сколько раз было обращение к этим строкам
1
29
7 месяцев назад
1
а разве именно это не делает эта имеющаяся строка в коде?
Нет, она уже сверяет координаты. Если сверять всех со всеми, то это будет O(n*n). А имелось в виду сверять только ближайшие координаты, чтоб хоть как-то понизить сложность.
варик начинают загружать именно эти две строки:
Зачем получать координаты из игры, если стандартная система перемещений отключена? Почему не хранить их в массиве не пользоваться только Set?
1
8
7 месяцев назад
Отредактирован goodlyhero
1
варик начинают загружать именно эти две строки:
Варкрафт загружает то, что у вас происходит полный перебор всех пар юнитов.
Стандартные варкрафтовские функции в этом плане работают намного умнее и количество юнитов почти не влияет на скорость. Соответственно функция GroupEnumUnitsInRect Вернет вам всех юнитов в квадрате за время. которое не зависит от количества юнитов на карте примерно никак. И это буде примерно бесконечно быстрее на значителньных количествах юнитов.
0
14
7 месяцев назад
Отредактирован host_pi
0
nazarpunk: А имелось в виду сверять только ближайшие координаты, чтоб хоть как-то понизить сложность.
какой нативкой можно сверять ближайшие координаты у других юнитов рядом с заданным?
nazarpunk: Зачем получать координаты из игры, если стандартная система перемещений отключена? Почему не хранить их в массиве не пользоваться только Set?
прекрасное замечание, завтра попробую пошаманить и перевести координаты на глобалки
goodlyhero: EnumUnitsInRect
благодарю, тоже попробую брать чуть расширенный рект юнита и применять к нему EnumUnitsInRect
благо карта позволяет всё измерить сразу же
1
8
7 месяцев назад
Отредактирован goodlyhero
1
какой нативкой можно сверять ближайшие координаты у других юнитов рядом с заданными?
Получить набор ближайших юнитов можно черезк как уже описывалось GroupEnumUnitsInRect. Способа сравнивать по координатам в ванильном варике я не знаю. Не работает, вроде как, на юнитов с локустами, но тут можно придумать много чего.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.