实例化 FlxPoint 的正确方法

Correct way to instantiate a FlxPoint

(我正在使用 HaxeFlixel 的开发分支)

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

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

通过阅读方法注释,我发现存在某种池化可能会加速创建 FlxPoints。分别在什么情况下使用这三种方式新建FlxPoint?

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

对我来说,.get() 似乎适用于长期变量(玩家起始位置、存储在数组中用于寻路的点等),而 .weak() 则适用于临时变量(中间值)在函数内计算)。这样对吗?

FlxPoint 提供了一种池化机制,应该有助于减少垃圾收集。

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

weak() 更多的是关于用于库调用而不是长寿(尽管这通常意味着它是 short-lived)- 这是它的文档:

Recycle or create a new FlxPoint which will automatically be released to the pool when passed into a flixel function.

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

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

你说得很对。

var pt:FlxPoint = new FlxPoint(); 这将创建一个新的 FlxPoint,而不会将其添加到 'pool' 或将其设置为弱。 'weak' FlxPoint 是在传递给标准 haxeflixel 方法后将被销毁的点。同样,调用 new 使其不弱,并且不在池中。

正如您所说,它对于更永久的 FlxPoints 很有用,例如存储关卡开始的位置。


var pt:FlxPoint = FlxPoint.weak(); 这与调用 new FlxPoint 相同,但它也将点设置为弱点。一旦在 Haxeflixel 函数中使用,弱 FlxPoint 就会被回收。默认情况下它不在池中,但是如果调用 .putWeak() 将被添加到池中。 putWeak() 只是回收一个临时的(弱的)FlxPoint。尽管 putWeak() 在 haxeflixel 代码中,但如果您想丢弃一个临时的、弱的 FlxPoint,您可以很容易地调用 putWeak

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


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

这在您要创建大量 FlxPoint 但仅临时使用它们时最有用。例如,如果您需要一个 FlxPoint 来显示子弹将落在何处,而玩家正在发射数百发子弹,那么从池中回收 FlxPoint 比调用 new FlxPoint 每颗子弹要便宜得多。

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

FlxPoint.get() 从池中检索 FlxPoint 并要求您在完成后手动 put() 将其取回。将其用于 long-lived 个变量。您可以在构造函数中使用 get(),在需要点成员变量的 class 的 destroy 方法中使用 put()

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

new 实例化一个 FlxPoint 创建一个没有池化的点。垃圾收集器会处理它,前提是您不依赖对它的引用。对奇数点执行此操作很好,只要性能或垃圾收集暂停不是大问题,也可以。