正确的实例化FlxPoint的方法

时间:2016-01-23 21:05:37

标签: haxe haxeflixel

(我正在使用HaxeFlixel的dev分支)

要创建一个新的FlxPoint变量,我可以做三件事之一......

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

通过阅读方法评论,我发现存在某种集合,可能会加速创建FlxPoint。在什么情况下我应该使用这三种方法中的每一种来创建新的FlxPoint

我有几个函数可以接受FlxPoint作为参数,或者返回它们。我应该复制FlxPoint本身的内容,并使用.weak()创建它们,并.putWeak()来回收传递给函数的点吗?

对我而言,似乎.get()适用于长寿命变量(玩家开始位置,存储在数组中用于路径查找的点等),.weak()用于临时变量(在此范围内计算的中间值)一个功能)。这是对的吗?

3 个答案:

答案 0 :(得分:3)

FlxPoint提供了一个池化机制,可以帮助减少垃圾回收。

FlxPoint.get()尝试从池中检索未使用的点。如果没有,它实际上与new FlxPoint()相同。任何一个都可以通过put()回到池中来回收。

weak()更多的是用于库调用而不是长寿(虽然这通常意味着它是短暂的) - 这是它的文档:

  

回收或创建一个新的FlxPoint,它会在传递给flixel函数时自动发布到池中。

这意味着您无需担心在此示例中保留对枢轴点的引用并对其进行回收,因为rotate()会为您调用putWeak()

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

答案 1 :(得分:2)

你非常正确。

var pt:FlxPoint = new FlxPoint(); 这会创建一个新的FlxPoint,而不会将其添加到“池”或将其设置为弱。 “弱”FlxPoint是在传递给标准haxeflixel方法后将被销毁的。再一次,调用new会使它不弱,而不是在池中。

正如你所说,它对更持久的FlxPoints很有用,例如存储水平开始的位置。

var pt:FlxPoint = FlxPoint.weak(); 这与调用new FlxPoint相同,但它也设置为弱点。一旦弱的FlxPoint用于Haxeflixel功能,它就会被回收利用。默认情况下它不在池中,但是如果调用.putWeak(),则会将其添加到池中。 putWeak()只是回收临时(弱)FlxPoint。虽然putWeak()位于haxeflixel代码中,但如果要丢弃临时的弱FlxPoint,则可以轻松调用putWeak

这对于临时计算期间使用的点最有用。您可以看到它在FlxPoint本身中使用,当数学在两点之间时(例如它们是added时)。

var pt:FlxPoint = FlxPoint.get(); 这种获取FlxPoint的方法尝试从FlxPoints池中检索FlxPoint。这很有用,因为从内存中检索现有点并对其进行控制比创建新点便宜。您可以(并且应该)在完成后通过调用.put()将此Point返回到池中。

这对于创建FlxPoint的负载但仅暂时使用它们非常有用。例如,如果您需要FlxPoint来显示子弹落地的位置,并且玩家正在射击数百颗子弹,那么从池中回收FlxPoint比调用每个子弹new FlxPoint要便宜得多。

正如你所看到的,它们都以某种方式联系在一起,并且非常相似。

答案 2 :(得分:2)

FlxPoint.get()从池中检索FlxPoint,并要求您在完成后手动put()。将此用于长寿命变量。您可以在构造函数中使用get(),在需要点成员变量的类的put()方法中使用destroy

FlxPoint.weak()为您提供了一个在put()putWeak()上调用时返回池中的点。就像你说的那样,将它们用于临时或中间值是最好的。 HaxeFlixel为采用FlxPoints的方法执行此操作,您也可以在自己的代码中遵循该模式。

使用new实例化FlxPoint会创建一个没有池的FlxPoint。垃圾收集器会处理它,只要您不挂起它的引用。对于奇数点这样做很好,只要性能或垃圾收集暂停不是一个大问题就可以了。