实例化 FlxPoint 的正确方法
Correct way to instantiate a FlxPoint
(我正在使用 HaxeFlixel 的开发分支)
要创建一个新的 FlxPoint
变量,我可以做以下三件事之一...
var pt:FlxPoint = new FlxPoint();
var pt:FlxPoint = FlxPoint.weak();
var pt:FlxPoint = FlxPoint.get();
通过阅读方法注释,我发现存在某种池化可能会加速创建 FlxPoint
s。分别在什么情况下使用这三种方式新建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 创建一个没有池化的点。垃圾收集器会处理它,前提是您不依赖对它的引用。对奇数点执行此操作很好,只要性能或垃圾收集暂停不是大问题,也可以。
(我正在使用 HaxeFlixel 的开发分支)
要创建一个新的 FlxPoint
变量,我可以做以下三件事之一...
var pt:FlxPoint = new FlxPoint();
var pt:FlxPoint = FlxPoint.weak();
var pt:FlxPoint = FlxPoint.get();
通过阅读方法注释,我发现存在某种池化可能会加速创建 FlxPoint
s。分别在什么情况下使用这三种方式新建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 创建一个没有池化的点。垃圾收集器会处理它,前提是您不依赖对它的引用。对奇数点执行此操作很好,只要性能或垃圾收集暂停不是大问题,也可以。