Наиболее эффективный способ отслеживания значений x и y нескольких экземпляров объектов на рабочей площадке?

#actionscript-3

#actionscript-3

Вопрос:

У меня произвольное количество экземпляров объектов на сцене. В любой момент времени количество объектов может составлять от 10 до 50. Каждый экземпляр объекта может перемещаться, но перемещение происходит постепенно, текущие координаты непредсказуемы, и в любой момент мне может потребоваться получить координаты конкретного экземпляра объекта.

Существует ли в этом случае общий метод наилучшей практики для отслеживания координат экземпляра объекта? Я могу придумать два подхода:

  1. Я пишу функцию в классе object, которая при выполнении произвольного события вызывается для экземпляра объекта и возвращает координаты этого экземпляра объекта.
  2. В классе object я объявляю глобальные статические переменные, которые представляют значения x и y, и при выполнении произвольного события переменные обновляются последними значениями для этого экземпляра объекта.

Хотя я могу заставить работать оба метода, я не знаю, будет ли один или другой пагубным для производительности программы в долгосрочной перспективе. Я склоняюсь к глобальным переменным, потому что я ожидаю, что обновление и вызов переменной требуют меньших ресурсов, чем вызов функции, которая впоследствии обновляет и вызывает переменную. Может быть, есть даже третий вариант?

Я понимаю, что это несколько субъективный вопрос. Я спрашиваю о потреблении ресурсов, поэтому, пожалуйста, ответьте в этом отношении.

Комментарии:

1. Похоже, вы, возможно, преждевременно оптимизируете. Оба варианта, которые вы здесь представляете, могут быть реализованы очень быстрыми и очень медленными способами. Ни то, ни другое не будет просто «быстрее». Один из вариантов — выбрать подход, построить его, найти узкие места в вашем коде, а затем оценить, где происходит замедление.

2. Я на самом деле работаю в то же время, когда задаю этот вопрос.

3. Итак, вы указали место в коде, которое работает медленно?

4. Я не диагностирую существующую проблему, я использую здесь обратную связь (которая до сих пор была очень полезной!), Чтобы попытаться заранее сделать правильный выбор дизайна.

Ответ №1:

Я не понимаю.. x Свойства y и хранятся в объекте (если это DisplayObject) и доступны для чтения.. Зачем вам хранить их в глобальном или каком-либо другом?

Если вы не используете DisplayObject его в качестве базового, просто создайте свойства самостоятельно с помощью соответствующих методов получения.

Если вы хотите получить координаты всех ваших объектов, добавьте их, скажем, в массив objectList .

Затем просто используйте цикл для проверки значений:

 for each(var i:MovieClip in objectList)
{
    trace(i.x, i.y);
}
 

Я думаю, что я неправильно понял вопрос.

Комментарии:

1. Ваши знания явно превосходят мои 🙂 У меня есть один класс объектов, который определяет объект. Существует основной класс, который добавляет его на сцену, и третий класс, которому необходимо знать значения x и y первого экземпляра объекта. Я понимаю, что он должен быть в DisplayObject, если он находится на сцене. Массив был бы хорошим способом отслеживать все, что добавлено на сцену. Если у меня есть массив в одном классе, то как другой класс может получить доступ к этому массиву? Извините, что не упомянул классы ранее, я не понимал, что это актуально.

2. Ах, так что вы можете сделать здесь, это определить массив в том классе, который создает объекты. Я бы поставил objectList.push(your_object) сразу после addChild(your_object)

3. Итак, если второй класс вызывает addChild(object), а третий класс должен знать x и y объекта, который я отправил в массив.. будет ли массив глобальным или я все еще упускаю что-то очевидное?

4. Ах, я понимаю, к чему вы клоните, извините. Хорошей практикой здесь является наличие типа базового класса, который будет хранить подобные вещи. Отсюда каждый из ваших объектов должен иметь ссылку на этот базовый класс. Затем базовый класс также имеет ссылки на другие классы, такие как диспетчер данных и т. Д. Чтобы упростить задачу, я бы просто создал массив в этом базовом классе. Когда вы создаете свой объект, просто определите ссылку на базовый класс. Теперь в вашем объекте вы должны иметь возможность делать что-то вроде core.objectList ссылки на массив.

5. Ах, ха! Это ставит оба моих подхода в позор. Я этого не видел. Отличный вклад и спасибо, что показали мне то, чего я не понимал. Спасибо!

Ответ №2:

определенно 1. для удобства чтения кода используйте свойство get, т. е.

 public function get x():Number { return my_x; }
 

Проблема с 2 в том, что вам также может потребоваться отслеживать, для какого объекта предназначены эти координаты — не говоря уже о том, что это просто беспорядочно… Глобальные переменные могут быстро стать неуправляемыми, отсюда и весь этот повторный поиск в ООП и инкапсуляции, а также устранение (в основном) необходимости в глобальных..

только с 50 или менее объектами — даже не рассматривайте проблемы с производительностью…

И помните эту старую мантру — «Преждевременная оптимизация — корень зла программирования» 😉

Комментарии:

1. 50 объектов довольно тривиально — я имею в виду, если вы проверите projectavian.com вы увидите, что 4000 объектов перемещаются без проблем (не говоря уже об этом Math.sin() , Math.cos() а Math.atan2() также выполняются на каждом из этих объектов для обновления позиционирования).