Я разрабатываю игру, используя 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 как хранить данные для обнаружения столкновений
ответ
Резервные данные довольно плохи, поскольку избыточность приводит к нехватке времени и памяти, а также к ошибкам программирования. Изменение метода третьей стороны является плохим, так как я хочу переделать его, когда он будет обновлен. Как-то все решения плохие, но вы должны всегда измерять его. Является ли мусор реальной проблемой?
Я бы перешел на использование Vector2
везде, если это возможно. Вы также можете переработать существующий вектор и заполнить его своими данными. Это устраняет проблему с мусором, но по-прежнему сохраняется стоимость копирования.
Окончательное решение зависит от вас. Я сомневаюсь, что любой мог бы точно сказать, что лучше для вас.
LibGdx имеет класс Pools
, так почему бы вам не использовать его?
Вот пример:
Vector2 position = Pools.obtain(Vector2.class);
// use your Vector2 for something
Pools.free(position);
Вы не будете иметь никаких избыточных данных, она все равно будет быстро и гораздо более предсказуемы, чем имеющие объекты без необходимости выделенные на каждом кадре.
Мои 2 цента:
Я согласен, что преждевременная оптимизация это плохая идея, но в моем опыте это полезно принять определенный дизайн подходы при принятии определенных типов приложений.
В частности, я считаю, что рекомендуется избегать ненужных распределений объектов для каждого кадра при создании игр, особенно для таких платформ, как Android.
Эти распределения не могут быть проблемой сейчас или для некоторых конкретных устройств, но могут вернуться и укусить вас в попку, и вам может потребоваться сделать некоторые нетривиальные изменения в вашем коде - это произошло мне.
Спасибо за это решение! Я думаю, что останусь с моим текущим кодом. Но если я столкнулся с проблемами, я попробую это сделать. Это не будет большим изменением кода, так как мне нужно заменить «новый Vector2()» на «Pools.obtain (Vector2.class)». Большое спасибо! – Springrbua
Учитывая, что для «Vector2» требуется только 16 байт, а «Pools.obtain (Vector2.class)» нужно найти правильный список для класса (хеширование) и получить объект, он выглядит довольно дорого для меня. Но у меня практически нет опыта работы с Android, поэтому он не может много говорить; во всяком случае, даже если это стоит больше времени, чем распределение и сбор, все равно может иметь смысл, так как это может избежать пауз GC. – maaartinus
- 1. Вращающийся эллипс Libgdx для обнаружения столкновений
- 2. LibGDX - Независимый межсектор для обнаружения столкновений
- 3. Плитка обнаружения столкновений в libgdx игры Android
- 4. Сбой обнаружения столкновений слишком рано в libgdx
- 5. Пуля для обнаружения обнаружения столкновений
- 6. QuadTree для обнаружения двумерных столкновений
- 7. Box2D только для обнаружения столкновений
- 8. Использование CGRectIntersectsRect для обнаружения столкновений
- 9. Как я могу использовать Actor.hit для обнаружения столкновений?
- 10. Схема делегирования обнаружения столкновений
- 11. Как это сделать для обнаружения столкновений?
- 12. Методология обнаружения столкновений
- 13. Создание простого обнаружения столкновений
- 14. Система обнаружения столкновений
- 15. Обнаружение столкновений в libgdx
- 16. Распознавание столкновений Прямоугольники Libgdx
- 17. Ошибка обнаружения столкновений Pygame
- 18. Ошибка обнаружения столкновений Pygame
- 19. Обнаружения столкновений SceneKit Swift
- 20. Внедрение обнаружения столкновений
- 21. Ошибка обнаружения столкновений HTML5
- 22. Ошибка обнаружения столкновений Box2D
- 23. Реализация обнаружения столкновений
- 24. Обнаружение столкновений (LibGDX)
- 25. управления Столкновение обнаружения в Libgdx
- 26. Использование box2d для обнаружения столкновений, но игнорирование сил
- 27. Движение jmonkeyengine слишком быстро для обнаружения столкновений
- 28. Обнаружения столкновений между повернутым UIViews
- 29. Алгоритм обнаружения столкновений на пикселях для WindowsForms
- 30. BoundingBoxes для обнаружения столкновений и возникновения проблем
На самом деле мусор не проблема, потому что я только начал игру, и единственными объектами, которые должны обнаружить столкновения, являются стены, мой игрок и пули (возможно, около 20). Но позже, когда я добавляю врагов, которые также могут стрелять, я думаю, что это может быть проблемой. Изменение третьей стороны было больше похоже на создание моего собственного класса «MyIntersector» с помощью методов, которые мне нужны, с использованием алгоритма libgdx Intersector. Резервные данные будут в каждом объекте, поэтому да с врагами, которые стреляют в пули, это может быть много. Что вы предлагаете в этом случае? – Springrbua
Я бы не сделал никакого уродливого решения, прежде чем увидеть какие-либо реальные проблемы. Много мусора плохо, но мусор, живущий только на короткое время, довольно вреден (стоимость GC растет с сохранившимися объектами). Проблема пересечения достаточно проста для самодельного решения, так что все в порядке. Единственное решение, которое я бы исключил сейчас, - это избыточность - это слишком уродливо. – maaartinus
Итак, я не изменяю свое обнаружение столкновения на данный момент, и если я столкнулся с проблемами с gc, я напишу свое собственное обнаружение столкновения. Я видел, что единственный метод, который действительно нуждается в Vector2, - это пересечение круговых линий, которое я использую только для игрока против стены и врага против стены. Поэтому я думаю, что мусора не будет много. По крайней мере, я надеюсь: P Спасибо большое! – Springrbua