2014-03-12 178 views
1

这可能是一个noob问题,但我只是不明白。Java:在不更改所有引用的情况下更改对象值

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

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

这是可能的吗?

回答

1

虽然这不是直接回答你的问题,希望这将帮助你做出一个好的决定

JVM已经在重新使用对象变得非常好,一般情况下不应害怕使用新的关键字。

有关详细阅读,请should-we-avoid-object-creation-in-java

+0

所以这不再是真正的问题了?那很好。正如我在另一个答案上写道的,我听说在render方法中创建新对象(称为每个gameloop的方法)会导致巨大的性能问题。非常感谢 – Springrbua

+0

我和埃里克斯坦在这里一样,不要过早优化,如果你的程序运行良好,没关系。如果你的程序运行不正常,找到瓶颈并修复它。 – Richo

+0

好的,谢谢你的回答。我会尝试'new'运算符并观察性能。谢谢 – Springrbua

1

你在找什么是不可能的。你只有一个Node对象的实例,指针指向多个位置的对象。您需要创建新的Node实例。

它会搞砸了垃圾收集和耗费了大量的性能

如果您有没有做过性能测试,并证明这是不可接受的瓶颈,你不应该承担这一点。

+0

我与libgdx和许多教程那里工作建议用池,以避免创建'new'对象。所以我认为这将是真正的表现沉重。感谢您的回答! – Springrbua

+0

@Springrbua嗯,我对libgdx一无所知,所以我不能特别对这个API说话。我会建议尝试制作新节点,看看是否存在性能问题。如果是这样,您可以随时在这里提出另一个问题,可能使用libgdx标记和一些麻烦的源代码。 –

+0

好的。非常感谢。现在我只是不知道我应该接受哪个答案,因为你们都帮助了我...... P – Springrbua

相关问题