Можно ли как-нибудь периодически находить ближайший разрушаемый объект к точке X без постоянного перебора (лагает, объектов много) и без участия заранее созданных точек: точку Y мне необходимо создавать только тогда, когда ближайший объект уже найден.

Принятый ответ

Не давно показывал эту функцию
поиск декораций
function CheckDes takes nothing returns nothing
local destructable d=GetEnumDestructable()
if GetDestructableLife(d)>0 and cdb==false  and d!=null then
set cdb=TRUE
endif
set d=null
endfunction

function PCD takes real x,real y, unit u returns boolean//PointConteintDes
local rect r
local real d=50
set r=Rect( x - d*2, y - d*2, x + d*2, y +d*2 )
set cdb=false
call EnumDestructablesInRect(r,null,function CheckDes)
call RemoveRect(r)
set r=null
return cdb
endfunction
Я точно это проверял на карте в 1000 объектов у 4 источников одновременно, больше не было думаю условия одинаковые.. Но нужно будет переделать под ваши нужды в CheckDes мы по очереди перебираем все разрушаемые в нужно регионе, изначально функция создана для нахождения какой либо разрушаемого, но тут достаточно добавить пару глобалок на, темболее возле героя же будет не 500-1000 разрушаемых а например до 10, если это деревья
Obelick, если ещё какие либо ньюансы для нахождения этого близжайшего декора, мне легче показать как я себе представляю реализацию такой задачи, чем объяснить, но нужно больше исходных данных, особоенно волнуют вопросы
сколько может быть разрушаемых в радиусе 512 и какой интервал
quq_CCCP, а если не мемхаком, просто послать рубить деревья, а потом как то извлечь дерево записанное в приказе, хз на сколько это возможно GetDestructableOrder(), если ли такое вообще? но адрес в памяти точно такой имеется...
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
0
25
5 лет назад
Отредактирован Jack-of-shadow
0
Obelick:
Лагать не должно, если правильно отсеивать.
У меня в карте более 30 к разрушаемых пропсов, заспавненных во время игры (около 30 декораций на радиус 500 ед.) Через енум и стрелы летят и проверка на зрение работает и все норм.
То что предложил Bergi_Bear самое оно, только ректы можно глобальные подготовить разных размеров заранее.

Obelick:
В 512 думаю около 10, интервал 2 секунды. Но фишка в том, что в этом радиусе может и не быть подходящих объектов.
Что то мне подсказывает что именно при "ненахождении" объектов возникают проблемы. Возможно вы что то упустили в этом месте.
0
32
5 лет назад
0
Obelick, ну такое точно не должно лагать, если даже у Джека всё норм, покажи нам свой код наверное какой-то лишний перегруз
0
32
5 лет назад
0
Bergi_Bear, да, об этом в статьях есть, отправь работника рубить лес и посмотри цель текущего приказа...
0
23
5 лет назад
0
Jack-of-shadow, как отсеивать в пике дудады, если условных пиков нет? Можно только выбрать все на карте/в радиусе и уже далее ставить условия
0
19
5 лет назад
Отредактирован KaneThaumaturge
0
Я когда-то давно так делал:
x = 50
Цикл
	Ищем декорации в радиусе x от изначальной точки
	Если нашли, то выбрать любой декор, который нашли выше и сохранить его.
	Иначе х = х + 50 и повторить цикл.
Ну, тут нужно добавить, что могут быть погрешности в пределах 50 точек, но мне это было не принципиально.
Также будет зацикливание, если дудов на карте вообще нет или они все мертвы, но это исправляется условием.
0
23
5 лет назад
0
KaneThaumaturge, у меня лагает, когда пикаешь дудады. Ботов может быть много и каждый пикает от 500+ каждые 2 секунды. Спайк небольшой, но заметен.
0
23
5 лет назад
0
создаю дамми и вручаю юнит несколько дерево и даю приказ продолжить работу и он приказ ловит и узнаем декорация. havet
0
25
5 лет назад
Отредактирован Jack-of-shadow
0
Obelick:
Все таки сколько одновременно юнитов выбираеют декор?
Возможно лагает какраз от того, что у тебя много юнитов делают enum одновременно в одном тике.
В таком случае неважно какая периодичность - лагать будет одинаково. Можно решить примерно
так

Очень утрированный пример:

таймер 0.01
выборка для unit[index]
index++
if index > 200 { index = 1}
на 200 юнитов хватит и будет периодичность 2 секунды.

Потом какие нибудь важные декорации которые ты ищешь можно найти один раз при загрузке карты, тем более что она у тебя генерируемая. Например создать отсортированные массивы определенного типа по которым можно делать более быстрый перебор, чем по всем декорациям на карте.
0
23
5 лет назад
0
Jack-of-shadow, 7 юнитов одновременно каждые 2 секунды пикают от 600 до 900 дуадов
0
25
5 лет назад
Отредактирован Jack-of-shadow
0
Пример выше должен помочь, если перебирать не 900 декораций сразу, а например по 90 каждые 0.1. Если равномерно распределить, то по примерно по 5 декораций выбираться будет за кадр.

Я правильно понимаю тебе нужно отсортировать декорации по дальности от базы?
0
23
5 лет назад
0
Jack-of-shadow, да, верно. Чтобы компьютер захватывал сначала ближайшие клетки, а уже потом отдалялся от своей базы.
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.