Перейти к содержимому


Фотография

Способ проверки выполнения кода на чём то для каждого чего то в определённом радиусе


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 22

#1 OFFLINE   Ilias

Ilias

    Прапорщик

  • Пользователи
  • 512 сообщений

Отправлено 26 June 2016 - 05:41

*(способ выполнения кода на чём то для каждого чего то в опр..)

 

Есть длииинный array с positions 3d , нужно выполнять код для всех координат с всеми координатами в определённом радиусе

e.:

while{true}do{{_p=_x;
     {if(_p distance _x<..)then{....}}foreach _a;
}foreach _a};

только нужен способ это делать /\ не выполняя ничего вроде /\ (нужно сократить время на эту проверку до 0)

e.:

_la=[];
{_la pushback("_"createvehicle _x)}foreach _a;
while{true}do{{{....}foreach nearobjects["_",..]}foreach _la};

(но /\ чрезмерная нагрузка)

appreciate любые идеи


Сообщение отредактировал Ilias: 26 June 2016 - 05:46

  • 0

#2 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 26 June 2016 - 17:30

Ни чего не понял !)

/\

?


Сообщение отредактировал SteelRat: 26 June 2016 - 17:31

  • 1

#3 OFFLINE   Ilias

Ilias

    Прапорщик

  • Пользователи
  • 512 сообщений

Отправлено 26 June 2016 - 18:07

Ни чего не понял !)

/\

?

*/|\ (((указатель)))


  • 0

#4 OFFLINE   SomeOneAndrey

SomeOneAndrey

    Ефрейтор

  • Пользователи
  • 43 сообщений

Отправлено 26 June 2016 - 22:03

По поводу ускорения выполнение первого кода есть такие мысли

  • Есть вероятность того, что через select будет быстрее проводится отбор подходящих позиций
  • Если не важна вертикальная погрешность, то было бы не плохо использовать позицию 2D для дистанции, что наверняка бы ускорило подсчеты
  • Еще можно попробовать написать свой метод для проверки дистанции, чтобы он сверял только Х и Y

Какая вообще задача? Может есть иные пути решения


  • 1

#5 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 27 June 2016 - 00:20

 

Еще можно попробовать написать свой метод для проверки дистанции, чтобы он сверял только Х и Y

 

 

distanceSqr

 

Как вы должны помнить из школьной математики, чтобы найти расстояние между двумя точками в декартовой системе координат, вам нужно воспользоваться следующей формулой:

 

distance = sqrt ((x- x1)2 + (y- y1)2 + (z- z1)2)

 

Именно это делает обычная команда distance. А в команде distanceSqr отсутствует операция извлечения квадратного корня, поэтому, она бесполезна, если вам нужно знать точную дисстанцию, но она весьма полезна, когда вам нужно сравнить две дисстанции:

 

distanceSquared = (x- x1)2 + (y- y1)2 + (z- z1)2

 

Поскольку в ней на одну математическую операцию меньше, чем в distance, то работает команда distanceSqr быстрее (кстати, одно лишь извлечение корня забирает гораздо больше вычислительной мощи, нежели оставшаяся часть команды), и должна бы оказаться полезной для оптимизации скриптов. Но, как ни странно, эксперименты КК показали, что разница ничтожна, но всё же есть. Использование:

 

distanceSquared=ObjectOrPositionOrLocation distanceSqr ObjectOrPositionOrLocation;

//ObjectOrPositionOrLocation - это переводится как Объект или Позиция, или Месторасположение

 

ArmA Scripting Tutorials: distanceSqr, linearConversion, difficulty, setAmmo, drawIcon3d

https://arma3.ru/for...saniiu/?p=14534


  • 0

#6 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 27 June 2016 - 00:33

А что тут придумаешь!

 

Стоит задача совершить операцию каждого элемента одного массива, с каждым элементом другого массива.

А так как эта задача выполняется не прерывно, это будет требовать к себе вычислительного ресурса.

Тем более что операции с массивами, сами по себе тяжелы для пищеварения процессора.

 

Если это мультиплеер, остаётся только один способ оптимизации, подключить всех клиентов к процессу, то есть распараллелить задачу.


  • 0

#7 OFFLINE   Ilias

Ilias

    Прапорщик

  • Пользователи
  • 512 сообщений

Отправлено 27 June 2016 - 01:24

По поводу ускорения выполнение первого кода есть такие мысли

  • Есть вероятность того, что через select будет быстрее проводится отбор подходящих позиций
  • Если не важна вертикальная погрешность, то было бы не плохо использовать позицию 2D для дистанции, что наверняка бы ускорило подсчеты
  • Еще можно попробовать написать свой метод для проверки дистанции, чтобы он сверял только Х и Y

Какая вообще задача? Может есть иные пути решения

спасибо, никаких вариантов ограничить проверяемое до только находящихся в определённом радиусе ? (nearobjects не проводит ведь проверку на расстояние к каждому объекту на карте, никак подобно для координат не сделать?)


Сообщение отредактировал Ilias: 27 June 2016 - 01:25

  • 0

#8 OFFLINE   SomeOneAndrey

SomeOneAndrey

    Ефрейтор

  • Пользователи
  • 43 сообщений

Отправлено 27 June 2016 - 02:40

 

По поводу ускорения выполнение первого кода есть такие мысли

  • Есть вероятность того, что через select будет быстрее проводится отбор подходящих позиций
  • Если не важна вертикальная погрешность, то было бы не плохо использовать позицию 2D для дистанции, что наверняка бы ускорило подсчеты
  • Еще можно попробовать написать свой метод для проверки дистанции, чтобы он сверял только Х и Y

Какая вообще задача? Может есть иные пути решения

спасибо, никаких вариантов ограничить проверяемое до только находящихся в определённом радиусе ? (nearobjects не проводит ведь проверку на расстояние к каждому объекту на карте, никак подобно для координат не сделать?)

 

Не представляю как это сделать, и не думаю, что это возможно


  • 0

#9 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 27 June 2016 - 02:53

Ilias, ну да не к каждому, но для этого движок создает древовидную структуру объектов и создает заранее различные списки (Списки живых игроков, техники и т д), поэтому он и делает это намного быстрее. Что бы ускорить ваш процесс нужно:
А) Если существуют точки не меняющие/редко меняющие свое положение, то не плохо бы всего лишь один раз выполнить нужные расчеты для них, а повторно их выполнять только при каком-либо изменении
Б) На начльном этапе сразу отсекать те точки, которые с высокой вероятностью не выполнят ваши условия (Например: точки находящиеся на разных концах Алтиса - наврятли выполнят ваше условие, или находящаяся в нескольких квадратах (100 на 100 метров) когда радиус необходимой зоны метров 10)
В) Так же не плохобы построить какое-либо дерево - если узел выше выполнил ваше условие, то и с большей вероятностью его выполнят и узлы находящие ниже от этого узла и наоборот (Очень эффективно если "зоны" могут включать в себя зоны по меньше)
Г) Какова цель проверки этих точек? (Например: если цель проверить нахождение объекта X неподалеку от каких-либо важных точек, то достаточно роверять это только если объект меняет свою позицию (А если стоит, то просто ждать изменений) ну и т д)
*Но тут еще нужно написать такой алгоритм, что бы ресурсы потраченые на эту оптимизацию, не превысили ресурсов потраченых при меньшем уровне оптимизации (Или вообще без нее)
Короче, ваш написанный выше код, может спокойно превратится в пару листов А4

Сообщение отредактировал vlad333000: 27 June 2016 - 02:59

  • 0

#10 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 27 June 2016 - 03:01

Что бы понять про что я тут написал загуглите "Октодерево" (Оно часто применяется в компьютерной графике, да и воообще в игровых движках)
  • 0

#11 OFFLINE   Ilias

Ilias

    Прапорщик

  • Пользователи
  • 512 сообщений

Отправлено 27 June 2016 - 03:01

Какая вообще задача? Может есть иные пути решения 

Ilias, ну да не к каждому, но для этого движок создает древовидную структуру объектов и создает заранее различные списки (Списки живых игроков, техники и т д), поэтому он и делает это намного быстрее. Что бы ускорить ваш процесс нужно:
А) Если существуют точки не меняющие/редко меняющие свое положение, то не плохо бы всего лишь один раз выполнить нужные расчеты для них, а повторно их выполнять только при каком-либо изменении
Б) На начльном этапе сразу отсекать те точки, которые с высокой вероятностью не выполнят ваши условия (Например: точки находящиеся на разных концах Алтиса - наврятли выполнят ваше условие, или находящаяся в нескольких квадратах (100 на 100 метров) когда радиус необходимой зоны метров 10)
В) Так же не плохобы построить какое-либо дерево - если узел выше выполнил ваше условие, то и с большей вероятностью его выполнят и узлы находящие ниже от этого узла и наоборот (Очень эффективно если "зоны" могут включать в себя зоны по меньше)
Г) Какова цель проверки этих точек? (Например: если цель проверить нахождение объекта X неподалеку от каких-либо важных точек, то достаточно роверять это только если объект меняет свою позицию (А если стоит, то просто ждать изменений) ну и т д)
*Но тут еще нужно написать такой алгоритм, что бы ресурсы потраченые на эту оптимизацию, не превысили ресурсов потраченых при меньшем уровне оптимизации (Или вообще без нее)
Короче, ваш написанный выше код, может спокойно превратится в пару листов А4

хочу добавить в свою игру автоматическую систему создания cached assets при появления возможности контакта


Сообщение отредактировал Ilias: 27 June 2016 - 03:27

  • 0

#12 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 27 June 2016 - 03:02

Ilias, каких б** ассетов? Рашн не шпрехн? И что за контакты?

Сообщение отредактировал vlad333000: 27 June 2016 - 03:02

  • 0

#13 OFFLINE   Ilias

Ilias

    Прапорщик

  • Пользователи
  • 512 сообщений

Отправлено 27 June 2016 - 03:10

Ilias, каких б** ассетов? Рашн не шпрехн? И что за контакты?

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание


Сообщение отредактировал Ilias: 27 June 2016 - 03:10

  • 0

#14 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 27 June 2016 - 03:29

Ilias, короче я так и не понял что вам там нужно, но попробую догадаться по вашему рисунку:
Дано:
1. N объектов движется
2. M заранее раставленых точек
Нужно:
Что-то поставить в точки 2 если что-то из 1 приблизилось
Первое что ришло в голову (Все цифры взяты от балды):
Создаем "Дерево" из точек 2 (Все условно) - 1 уровень: квадраты 1x1 км >> 2 уровень: делим квадраты 1 уровня на квадраты 100x100 метров >> 3 уровень: делим квадраты 2 уровня на квадраты 10x10 метров...
Идем дальше, смотрим на наше деление и на координаты x:1234.56 y:1234.56 (Еще можно z для колекции приписать) - видим, что 1 цифра - квадрат 1 уровня, 2 цифра - 2 уровня...
Идем еще дальше, смотрим нужный нам радиус: 567.89 метров >> смотрим чуть выше - ага наша 1 цифра это квадраты 2 уровня, а значит перебираем все возможные комбинации 1 уровень + 2 уровень * на прибавление индексов во все 4 стороны света
Итог: отсеиваем более 50% точек (Зачастую даже больше) простыми операциями с числами и получаем точные квадраты (Точки получаем кокрастаки из нашего дерева) которые с крайне высокой вероятностью удовлетворяют нашим условиям

Из минусов: требуется неплохой объем памяти и немалую скорость чтения данных (Мы от оптимизировали по времени за счет памяти)
Не эффективно если абсолютно все меняется
Требует выполнения основного алгоритма на старте
PS Угадал?

Сообщение отредактировал vlad333000: 27 June 2016 - 03:33

  • 0

#15 OFFLINE   Ilias

Ilias

    Прапорщик

  • Пользователи
  • 512 сообщений

Отправлено 27 June 2016 - 03:32

(если всё же не понятно:

на карте присутствуют ~300 objects, units, и записи о ~10000, если что нибудь движется нужно найти в записях всё что подходит по |тип,..|параметры|..=расстояние| и создать)


  • 0

#16 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 27 June 2016 - 03:35

Ilias, вы делаете застройку острова?
  • 0

#17 OFFLINE   Ilias

Ilias

    Прапорщик

  • Пользователи
  • 512 сообщений

Отправлено 27 June 2016 - 03:35

Ilias, короче я так и не понял что вам там нужно, но попробую догадаться по вашему рисунку:
Дано:
1. N объектов движется
2. M заранее раставленых точек
Нужно:
Что-то поставить в точки 2 если что-то из 1 приблизилось
Первое что ришло в голову (Все цифры взяты от балды):
Создаем "Дерево" из точек 2 (Все условно) - 1 уровень: квадраты 1x1 км >> 2 уровень: делим квадраты 1 уровня на квадраты 100x100 метров >> 3 уровень: делим квадраты 2 уровня на квадраты 10x10 метров...
Идем дальше, смотрим на наше деление и на координаты x:1234.56 y:1234.56 (Еще можно z для колекции приписать) - видим, что 1 цифра - квадрат 1 уровня, 2 цифра - 2 уровня...
Идем еще дальше, смотрим нужный нам радиус: 567.89 метров >> смотрим чуть выше - ага наша 1 цифра это квадраты 2 уровня, а значит перебираем все возможные комбинации 1 уровень + 2 уровень * на прибавление индексов во все 4 стороны света
Итог: отсеиваем более 50% точек (Зачастую даже больше) простыми операциями с числами и получаем точные квадраты (Точки получаем кокрастаки из нашего дерева) которые с крайне высокой вероятностью удовлетворяют нашим условиям

Из минусов: требуется неплохой объем памяти и немалую скорость чтения данных (Мы от оптимизировали по времени за счет памяти)
Не эффективно если абсолютно все меняется
Требует выполнения основного алгоритма на старте
PS Угадал?

выглядит многообещающе, но памяти уйдёт .....


  • 0

#18 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 27 June 2016 - 03:39

И все же что может двигатся 300 первых или овердофига вторых? (Т е какого рода эти объекты: солдафоны, дома, кусты, коровы...)
Ilias, если мы оптимизируем по скорости, то увеличение требований к памяти не избежно - одновременная оптимизация по обоим пунктам возможна лишь в двух случаях: ЕГЭ по Информатике и когда исходный алгоритм использовал излишние ресурсы (Много повторных расчетов того что уже было несколько раз просчитано)

Сообщение отредактировал vlad333000: 27 June 2016 - 03:39

  • 0

#19 OFFLINE   Ilias

Ilias

    Прапорщик

  • Пользователи
  • 512 сообщений

Отправлено 27 June 2016 - 03:39

Ilias, вы делаете застройку острова?

нет, мы играем войну на куче карт и с _ _ _ _ _.. units которые перемещаем между локациями и отстраиваем при возможности столкновения (последнее как можно было догадаться сейчас в ручную (тоесть не совсем, но выбирать что отстроить и нажимать кнопку приходиться))


  • 0

#20 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 27 June 2016 - 03:42

Ilias, ну т. е. все же застройка... Описаный мной выше алгоритм это просто мастхев будет для вашего случая (И не только он один) - сильно сократите расчеты. И вот еще: создавайте объекты локально у каждого клиента - и трафик сэкономите, и сократите расчеты - всего один такой цикл на каждом клиенте

Сообщение отредактировал vlad333000: 27 June 2016 - 03:43

  • 0




Яндекс.Метрика