【问题标题】:Java: Change an objects value without changing all referencesJava:更改对象值而不更改所有引用
【发布时间】:2014-03-12 23:17:18
【问题描述】:

这可能是一个菜鸟问题,但我就是不明白。

我正在尝试在我的游戏中实现 A* 寻路。我关注this tutorialAstarPathfinder.java 中的代码。但是我没有实例化 AStarPathfinder 类并为所有Nodes 提供一个 2D 数组,而是创建了一个静态方法,我将我的 2D 数组(关卡/世界)传递给该方法,开始和结束节点。 因此,我总是必须将当前和下一个Node 存储在Node nextNode current 中。然后我将它们添加到打开或关闭列表(取决于它们所属的位置)并使用它们的 setter 方法更改 Node 的 x 和 y 值(位置),以获得下一个节点。

经过几分钟的调试,我注意到这个 (ofc) 也改变了 openListclosedList 内节点的值。为了防止这种情况,我可以简单地调用next = new Node(int x, int y) 而不是只设置值,但是由于我的寻路功能每隔几个渲染循环就会运行一次,它会弄乱垃圾收集并消耗大量性能。所以我正在寻找一种可能性,有一个 Node 变量,我可以使用默认构造函数实例化一次,然后更改其值而不更改其在列表中的值。

这有可能吗?

【问题讨论】:

    标签: java object reference a-star


    【解决方案1】:

    虽然这不是您问题的直接答案,但希望它能帮助您做出正确的决定

    JVM 已经非常擅长重用对象,您通常不应该害怕使用 new 关键字。

    更多详细阅读请见should-we-avoid-object-creation-in-java

    【讨论】:

    • 所以这不再是真正的问题了吗?那挺好的。正如我在另一个答案中所写的那样,我听说在渲染方法(称为每个游戏循环的方法)中创建新对象会导致巨大的性能问题。非常感谢
    • 我和 Eric Stein 在同一页面上,不要做过早的优化,如果你的程序运行良好,那很好。如果您的程序运行不正常,请找到瓶颈并修复它。
    • 好的,谢谢您的回答。我将尝试new 运算符并查看性能。谢谢
    【解决方案2】:

    您正在寻找的东西是不可能的。您只有一个 Node 对象的实例,在多个位置都有指向该对象的指针。您需要创建新的 Node 实例。

    它会搞乱垃圾收集并消耗大量性能

    如果您尚未进行性能测试并表明这是一个不可接受的瓶颈,则不应假设这一点。

    【讨论】:

    • 我正在使用 libgdx,那里的许多教程建议使用池来避免创建 new 对象。所以我认为这将是非常重要的性能。感谢您的回答!
    • @Springrbua 好吧,我对 libgdx 一无所知,所以我不能特别谈论那个 API。我建议尝试制作新节点,看看是否存在性能问题。如果是这样,您总是可以在这里提出另一个问题,也许是 libgdx 标签和一些麻烦的源代码。
    • 好的。非常感谢。现在我只是不知道我应该接受哪个答案,因为你们都帮助了我......:P
    猜你喜欢
    • 2015-03-30
    • 2013-01-14
    • 2021-09-25
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-21
    相关资源
    最近更新 更多