есть одна 2D карта (по зеленой кнопке)
но код для просчёта коллизий может обработать только 11 юнитов
(если играть всемером - то получится, что можно добавить только 4 доп.юнита на карту)
если сделать 12 или 50 юнитов - то варик просто захлёбывается
(в карте есть счетчик обработки коллизий - максимально 80000 операций в секунду)
есть желающие поковыряться в коде и улучшить его, чтобы он смог обрабатывать 50 юнитов?
коллизии - это столкновение. по X это толкание соседних юнитов вправо влево, по Y это носить на голове или стоять сверху на юните
(если играть всемером - то получится, что можно добавить только 4 доп.юнита на карту)
если сделать 12 или 50 юнитов - то варик просто захлёбывается
(в карте есть счетчик обработки коллизий - максимально 80000 операций в секунду)
есть желающие поковыряться в коде и улучшить его, чтобы он смог обрабатывать 50 юнитов?
коллизии - это столкновение. по X это толкание соседних юнитов вправо влево, по Y это носить на голове или стоять сверху на юните
цепочка функций по просчёту коллизий:
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]) - считывание координат
графики:
скриншот карты:
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Отредактирован Jack-of-shadow
Отредактирован host_pi
(да и любой из вас его может изменить за пол минуты и чекнуть результат - www.epicwar.com/maps/332635 вот новая версия карты 1.4 с добавленным радиусным ускорением )
это чисто лимит варкрафта на колво вложенных циклов и операций в одном стеке
единственное что из похожего помогает уменьшить тормоза и поднять фпс - это ириновский !actioninterval
то есть какой смысл оптимизировать чужой код (который в новых версиях карты вообще обфусцирован) ради наносекунд или уменьшения в каком-то месте с 5 строк до 3, когда уже выявлена реальная причина тормозов - это количество коробок и их обсчёт коллизий
нагружают именно коллизии и как уже выше было сказано - вложенный квадратичный (а теперь уже радиусный) цикл по ним
Отредактирован Jack-of-shadow
Отредактирован host_pi
для этого создавать новый вопрос с тестовым мини кодом?
делать на глобалках? или на той же ht? а они разве не перезапишутся, если несколько ForGroup будут выполняться в разных тредах и перезаписывать результат в одну свою глобалку на true/false условно хаотично
или если ты в 3 глобалки (или в 3 значения в ht) записываешь входящие i , x , y - то они тоже будут прыгать при вызове MushroomMoving_CollisionCheck\ForGroup несколько раз т.к. идёт перезапись входящих общих переменных i x y при каждом их вызове
Отредактирован nazarpunk
Отредактирован host_pi
особенно в конце видео где 3 коробки - там видна рандомность - то стоит на коробке то проваливается
call TriggerRegisterTimerEvent(t,0.0002,true)
и даже если коробок 10 а не 100, то просчитает всё за 10 тиков, а остальные 90 будет скипать
а call Frame__SquaresMoving(i) отключил, то есть Frame__SquaresMoving просчитывается отдельным кодом вообще
что должно сказаться на физике
+ этот пост:
макс количество коробок поднялось до 50+ и уже упирается всё в fps
-box1 поднялось с 11(v1.0) 14(v1.4) до 22 (выше тоже можно но фпс ниже 20)
-box3 поднялось с 11(v1.0) 25(v1.4) до 35 (20 фпс)
при отключении -pro режима фпс вырастет с 20 до 40
а если найти ошибки в 1 и 2 варианте выше в этом посте то и сравнить на скорость и фпс все 3 способа
Отредактирован Jack-of-shadow
Отредактирован host_pi
теперь полноценно можно заспавнить 50 коробок и мерять свои фепосы
EN xgm.guru/files/100/315886/comments/520926/OMS_BoxLab_1.5_EN.w3x
RU xgm.guru/files/100/315886/comments/520926/OMS_BoxLab_1.5_RU.w3x
дальше уже только оптимизация кода для повышения фпс
Отредактирован host_pi
и это значение уже занято в функции Propelly__Main
т.к. на тестах после замены UnitIndex(u) на GetUnitUserData(u) фпс поднялся в разы
например 40 фпс наступает не при -box1 20 , а уже при -box1 37
а если сделать две лесенки: -ladder2 20 + 30 раз -box - итого 50 коробок двумя лесенками - то будет 30 фпс
Отредактирован host_pi
теперь можно с 30 коробками бегать в 64 фпс
и даже заспавнить 50 коробок двумя лесенками на 30 фпс
подробности на графике
EN xgm.guru/files/100/315886/comments/520944/OMS_BoxLab_1.7_EN.w3x
RU xgm.guru/files/100/315886/comments/520944/OMS_BoxLab_1.7_RU.w3x
Отредактирован nazarpunk
Отредактирован host_pi