Мне нужен цикл, который заставляет всех рабочих добывать ближайший (для склада) к ближайшему (для рабочего) складу ресурс, либо относить ресурс к складу, если уже добыл (реализовано через абилку, юзаемую на декор/склад). Постарался максимально прислушиваться к статьям по утечкам и т.п., вот что у меня получилось:
Всё работает, но чем больше работников на карте, тем больше просадки FPS...
Может что-то упускаю, какую-то функцию утечную использую, или вообще мой способ совсем не подходящий для моей цели?

Здравствуйте,
  1. Проверку на текущий приказ можно перенести в первый boolExpr, раз вы пользуетесь boolExpr .
  2. Когда ищется точка для склада (TempPoint[2]), проверка на min (99999) бесполезна так как ищутся юниты в радиусе 900.
  3. Ректы можно глобально создать 1 раз и перемещать, о чем говорил goodlyhero.
  4. Пик юнитов в радиусе 900 повторяется два раза, можно вынести наверх.
  5. Нагруженность пика юнитов зависит от количества всех юнитов на карте, а не только работников. Поэтому для работников можно сделать отдельную глобальную группу, добавлять и удалять из нее при создании и смерти работников.
  6. Оптимизировать время, поставить каждые 2 секунды.
Рекомендую переписать на jass/lua, и нормально назвать переменные TempPoint[1] и TempPoint[2], чтобы всем было понятно что они означают.
`
ОЖИДАНИЕ РЕКЛАМЫ...
8
Если вглядеться в код, что задача нетривиальная, видно, что вы 4 раза в секунду проверяете всех юнитов на карте работник ли это.
Добавляете их в группу.
Для каждого работника создаете квадрат, в нем проверяете все скажем разрушаемые объекты на предмет того, что же это есть.
Тоесть если у вас есть 100 работников, и в среднем 100 разрушаемых объектов на рект, то вы будете выполнять операции выбора деструкта 40000 раз в секунду, зная о том, какого вида код генерируется при вашем скрипте это просто жирновато. Соответственно, чем больше работников и разрушаемых - тем тяжелее игре дается код.
На практике, вам не нужно каждому юниту приказывать что-то делать 4 раза в секунду. Пока он занимается своим делом, что будет происходить большую часть времени, трогать его вообще не стоит.
1
На практике, вам не нужно каждому юниту приказывать что-то делать 4 раза в секунду. Пока он занимается своим делом, что будет происходить большую часть времени, трогать его вообще не стоит.
Перенёс проверку на текущий приказ ( = 0 ) в начало (в BoolExpr) + поставил проверку раз в секунду, но проблемы это не решило (потому что по сути ничего не поменялось, в коде и так стояла проверка на приказ = 0, но перед этим выбирались все работники, другими словами всё равно дальнейшие действия не проводились. Сейчас выбираются только "афк" стоящие, но эффект тот же самый).
Поэтому вопрос всё еще остаётся актуальным...
18
Здравствуйте,
  1. Проверку на текущий приказ можно перенести в первый boolExpr, раз вы пользуетесь boolExpr .
  2. Когда ищется точка для склада (TempPoint[2]), проверка на min (99999) бесполезна так как ищутся юниты в радиусе 900.
  3. Ректы можно глобально создать 1 раз и перемещать, о чем говорил goodlyhero.
  4. Пик юнитов в радиусе 900 повторяется два раза, можно вынести наверх.
  5. Нагруженность пика юнитов зависит от количества всех юнитов на карте, а не только работников. Поэтому для работников можно сделать отдельную глобальную группу, добавлять и удалять из нее при создании и смерти работников.
  6. Оптимизировать время, поставить каждые 2 секунды.
Рекомендую переписать на jass/lua, и нормально назвать переменные TempPoint[1] и TempPoint[2], чтобы всем было понятно что они означают.
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.