2016-01-23 63 views
3

(我使用HaxeFlixel的Dev分支)正確的方式來實例化一個FlxPoint

要創建一個新的變量FlxPoint我可以做的三件事情一個...

var pt:FlxPoint = new FlxPoint(); 
var pt:FlxPoint = FlxPoint.weak(); 
var pt:FlxPoint = FlxPoint.get(); 

從閱讀方法的意見,我已經發現有某種形式的池可能會加速創建FlxPoint s。在什麼情況下我應該使用三種方法中的每一種來創建新的FlxPoint

我有幾個函數要麼接受FlxPoint s作爲參數,要麼返回它們。我應該複製FlxPoint自己做什麼,並使用.weak()來創建它們,.putWeak()回收點傳遞給函數?

對我來說,似乎.get()是用於長期存在的變量(玩家開始位置,存儲在數組中用於路徑查找的點等),而.weak()用於臨時值(在函數內計算的中間值)。這是正確的嗎?

回答

2

FlxPoint提供了一個應該幫助減少垃圾收集的池化機制。

FlxPoint.get()嘗試從池中檢索未使用的點。如果沒有一個,它實際上與new FlxPoint()相同。任一人都可以通過put()回到游泳池。

weak()更多的是被用於庫調用比壽(儘管這確實往往意味着它是短暫的) - 這裏是它的文檔:

回收或創建一個新的FlxPoint它會自動被釋放到傳遞給flixel函數時的池。

這意味着你不必擔心保持參照支點和回收它在這個例子中,由於rotate()電話putWeak()它給你:

point.rotate(FlxPoint.weak(0, 0), 45); 
+0

我希望我可以將所有三個答案都標記爲「正確」,但是關於圖書館電話的一點說明它是最好的。接受FlxPoint的庫函數應該嘗試釋放它們,並且應該弱地創建它們,因爲它們可能會像你的旋轉示例一樣被多次調用。 – Piku

1

你幾乎正確。

var pt:FlxPoint = new FlxPoint(); 這會創建一個新的FlxPoint,但不會將其添加到「池」或將其設置爲弱。 「弱」FlxPoint是在傳遞給標準haxeflixel方法後將被銷燬的FlxPoint。再次,調用new使其不弱,不在池中。如你所說,它對於更永久的FlxPoints很有用,比如存儲關卡開始的地方。


var pt:FlxPoint = FlxPoint.weak(); 這等同於調用new FlxPoint但它也設置點要弱。一旦使用Haxeflixel功能,弱FlxPoint就會被回收。它在默認情況下不在池中,但是如果調用.putWeak()將被添加到池中。 putWeak()只是回收一個臨時(弱)FlxPoint。儘管putWeak()位於haxeflixel代碼中,但如果您想放棄臨時的弱FlxPoint,則可以輕鬆地調用putWeak

這對於在臨時計算過程中使用的點最爲有用。在兩點之間進行數學運算時(例如當它們是added)時,您可以看到它在FlxPoint中使用。


var pt:FlxPoint = FlxPoint.get(); 得到一個FlxPoint的這種方法試圖檢索FlxPoints的游泳池FlxPoint。這很有用,因爲從內存中檢索現有點並對其進行修改比創建新點要便宜。您可以(也應該)在完成該操作後,通過撥打.put()將此點返回池中。

這對於何時創建FlxPoint的負載,但僅臨時使用它們最有用。例如,如果您需要使用FlxPoint來顯示子彈落地的位置,並且玩家正在拍攝數百個子彈,則從池中回收FlxPoint比每個子彈調用new FlxPoint便宜得多。

正如你所看到的,它們都以某種方式連接起來,並且非常相似。

1

FlxPoint.get()從池中檢索到一個FlxPoint,並且需要您在完成後手動返回FlipPoint put()。將此用於長時間變量。您可以在構造函數中使用get(),在需要點成員變量的類的destroy方法中使用put()

FlxPoint.weak()給你一個返回池的點,當它調用put()putWeak()時。就像你說的那樣,將它們用於臨時或中間值是最好的。 HaxeFlixel爲採用FlxPoints的方法執行此操作,您也可以在自己的代碼中使用該模式。

使用new實例化一個FlxPoint會創建一個沒有共用的池。垃圾回收器負責處理它,前提是你不要掛在引用它的地方。對於奇怪的點來說,這樣做很好,並且在性能或垃圾收集暫停不是一個大問題時就沒有問題。

相關問題