2

Я разрабатываю игру, используя libgdx scene2d. Все мои объекты являются подклассами Actor (мы называем их GameObject), поэтому они уже имеют положение и размер, но все в отдельных полях (float x; float y; float height; float width;)). Для обнаружения столкновений я использую некоторые самодельные методы, но также некоторые методы Intersector. Методы Intersector необходимо Vector2 параметры положения и размера. Таким образом, я должен создать Vector2 предметов в Actor сек полей, каждый делают цикл. и это плохо для сбора мусора. Моя единственная идея, чтобы избежать этого, чтобы иметь Vector2 position и Vector2 size в my GameObject. Но тогда у меня есть избыточные данные, и мне нужно будет переопределить методы getter и setter для обновления данных Vector2 и Actor s (необходимо для рисования). Есть ли anot ее, лучший способ? Являются ли избыточные данные лучше, чем проблема с мусором? Или мне нужно скопировать методы Intersector и отредактировать их для использования float x и float y вместо Vector2?Libgdx как хранить данные для обнаружения столкновений

ответ

1

Резервные данные довольно плохи, поскольку избыточность приводит к нехватке времени и памяти, а также к ошибкам программирования. Изменение метода третьей стороны является плохим, так как я хочу переделать его, когда он будет обновлен. Как-то все решения плохие, но вы должны всегда измерять его. Является ли мусор реальной проблемой?

Я бы перешел на использование Vector2 везде, если это возможно. Вы также можете переработать существующий вектор и заполнить его своими данными. Это устраняет проблему с мусором, но по-прежнему сохраняется стоимость копирования.

Окончательное решение зависит от вас. Я сомневаюсь, что любой мог бы точно сказать, что лучше для вас.

+0

На самом деле мусор не проблема, потому что я только начал игру, и единственными объектами, которые должны обнаружить столкновения, являются стены, мой игрок и пули (возможно, около 20). Но позже, когда я добавляю врагов, которые также могут стрелять, я думаю, что это может быть проблемой. Изменение третьей стороны было больше похоже на создание моего собственного класса «MyIntersector» с помощью методов, которые мне нужны, с использованием алгоритма libgdx Intersector. Резервные данные будут в каждом объекте, поэтому да с врагами, которые стреляют в пули, это может быть много. Что вы предлагаете в этом случае? – Springrbua

+1

Я бы не сделал никакого уродливого решения, прежде чем увидеть какие-либо реальные проблемы. Много мусора плохо, но мусор, живущий только на короткое время, довольно вреден (стоимость GC растет с сохранившимися объектами). Проблема пересечения достаточно проста для самодельного решения, так что все в порядке. Единственное решение, которое я бы исключил сейчас, - это избыточность - это слишком уродливо. – maaartinus

+0

Итак, я не изменяю свое обнаружение столкновения на данный момент, и если я столкнулся с проблемами с gc, я напишу свое собственное обнаружение столкновения. Я видел, что единственный метод, который действительно нуждается в Vector2, - это пересечение круговых линий, которое я использую только для игрока против стены и врага против стены. Поэтому я думаю, что мусора не будет много. По крайней мере, я надеюсь: P Спасибо большое! – Springrbua

5

LibGdx имеет класс Pools, так почему бы вам не использовать его?

Вот пример:

Vector2 position = Pools.obtain(Vector2.class); 
// use your Vector2 for something 
Pools.free(position); 

Вы не будете иметь никаких избыточных данных, она все равно будет быстро и гораздо более предсказуемы, чем имеющие объекты без необходимости выделенные на каждом кадре.


Мои 2 цента:

Я согласен, что преждевременная оптимизация это плохая идея, но в моем опыте это полезно принять определенный дизайн подходы при принятии определенных типов приложений.

В частности, я считаю, что рекомендуется избегать ненужных распределений объектов для каждого кадра при создании игр, особенно для таких платформ, как Android.

Эти распределения не могут быть проблемой сейчас или для некоторых конкретных устройств, но могут вернуться и укусить вас в попку, и вам может потребоваться сделать некоторые нетривиальные изменения в вашем коде - это произошло мне.

+0

Спасибо за это решение! Я думаю, что останусь с моим текущим кодом. Но если я столкнулся с проблемами, я попробую это сделать. Это не будет большим изменением кода, так как мне нужно заменить «новый Vector2()» на «Pools.obtain (Vector2.class)». Большое спасибо! – Springrbua

+0

Учитывая, что для «Vector2» требуется только 16 байт, а «Pools.obtain (Vector2.class)» нужно найти правильный список для класса (хеширование) и получить объект, он выглядит довольно дорого для меня. Но у меня практически нет опыта работы с Android, поэтому он не может много говорить; во всяком случае, даже если это стоит больше времени, чем распределение и сбор, все равно может иметь смысл, так как это может избежать пауз GC. – maaartinus

Смежные вопросы