6

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

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

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

通过阅读方法注释,我发现存在某种池化可能会加速创建FlxPoints. 在什么情况下我应该使用这三种方式中的每一种来创建一个新的FlxPoint

我有几个函数要么接受FlxPoints 作为参数,要么返回它们。我应该复制FlxPoint它本身的功能,并使用它.weak()来创建它们,并.putWeak()回收传递给函数的点吗?

对我来说,这似乎.get()是针对长期变量(玩家开始位置,存储在数组中用于路径查找的点等),并且.weak()是针对临时变量(在函数中计算的中间值)。这是正确的吗?

4

3 回答 3

5

FlxPoint提供了一种池化机制,旨在帮助减少垃圾收集。

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

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

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

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

point.rotate(FlxPoint.weak(0, 0), 45);
于 2016-01-23T21:45:38.883 回答
4

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

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

实例化一个 FlxPointnew会创建一个没有池的。垃圾收集器会处理它,前提是您不要挂在对它的引用。对于奇怪的点这样做很好,只要性能或垃圾收集暂停不是一个大问题,它就很好。

于 2016-01-23T21:50:27.240 回答
3

你说得很对。

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 代码中,但putWeak如果您想丢弃一个临时的、弱 FlxPoint,您也可以轻松调用。

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


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

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

如您所见,它们都以某种方式联系在一起,并且非常相似。

于 2016-01-23T21:46:06.413 回答