Java: изменить значение объекта без изменения всех ссылок

1

Это, вероятно, вопрос о нобе, но я просто не понимаю.

Я пытаюсь реализовать A * pathfinding в своей игре. Я следовал этому руководству и коду в AstarPathfinder.java. Но вместо того, чтобы создавать экземпляр класса AStarPathfinder и иметь 2D-массив для всех Nodes я сделал статический метод, которому я передаю свой 2D-массив (уровень/мир), начало и конец узла. Причиной этого я всегда должен хранить текущий и следующий Node в Node next и Node current. Затем я добавляю их в открытый или закрытый список (в зависимости от того, где они принадлежат) и изменяют значение x и y (положение) Node с помощью метода их установки, чтобы иметь следующий узел.

После нескольких минут отладки я заметил, что этот (ofc) изменяет также значение узла внутри openList и closedList. Чтобы предотвратить это, я могу просто вызвать next = new Node(int x, int y) вместо того, чтобы устанавливать только значения, но поскольку мой Pathfinding работает каждые несколько циклов рендеринга, он испортил сборку мусора и стоил бы большой производительности. Поэтому я ищу возможность иметь одну переменную Node, которую я могу создать экземпляр с конструктором по умолчанию, а затем изменить его значение, не изменяя его значение в списке.

Это возможно как-то?

Теги:
object
a-star
reference

2 ответа

1
Лучший ответ

Хотя это не прямой ответ на ваш вопрос, надеюсь, это поможет вам принять правильное решение

JVM очень хорошо подходит для повторного использования объектов, и вы, как правило, не боитесь использовать новое ключевое слово.

Более подробное чтение см. В статье " Мы должны избегать создания объекта в Java"

  • 0
    Так что это больше не проблема? Это хорошо. Как я уже писал в другом ответе, я услышал, что создание новых объектов в методе рендеринга (метод, называемый каждые gameloop) вызывает огромные проблемы с производительностью. большое спасибо
  • 0
    Я на той же странице, что и Эрик Стейн, здесь, не делайте преждевременных оптимизаций, если ваша программа работает нормально, это нормально. Если ваша программа не работает нормально, найдите узкое место и исправьте его.
Показать ещё 1 комментарий
1

То, что вы ищете, невозможно. У вас есть только один экземпляр объекта Node, с указателями на этот объект в нескольких местах. Вам нужно создать новые экземпляры Node.

это испортило бы сбор мусора и стоило бы большой производительности

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

  • 0
    Я работаю с libgdx, и многие учебники там предлагают использовать пул, чтобы избежать создания new объектов. Так что я подумал, что это будет очень тяжело. Спасибо за Ваш ответ!
  • 0
    @Springrbua Ну, я ничего не знаю о libgdx, поэтому я не могу говорить с этим API в частности. Я бы предложил попробовать создать новые узлы и посмотреть, есть ли проблемы с производительностью или нет. Если это так, вы всегда можете задать еще один вопрос здесь, возможно, с тегом libgdx и некоторым проблемным исходным кодом.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню