2014-03-12 117 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

相關問題