【问题标题】:Flash ActionScript 3 - is there a memory leak in this function?Flash ActionScript 3 - 此函数是否存在内存泄漏?
【发布时间】:2011-11-01 22:09:52
【问题描述】:

我开始掌握内存分配(以及一般的 ActionScript 3),我在教程中遇到了这样的函数:

addEventListener(Event.ENTER_FRAME, enterFrame);

function enterFrame(e:Event):void
{

if(redClipBmpData.hitTest(new Point(redClip.x, redClip.y),255,blueClipBmpData,new Point(blueClip.x, blueClip.y),255))

trace("hit");

}

我担心的部分是 hitTest 函数中的 'new Point...' 位。因此,每次调用该函数时,都会分配新的内存来存储 Point 对象。

因为没有对 Point 的引用(如 var a: Point = new Point(...)),这是否意味着垃圾收集器会在调用函数后为“new Point”释放内存?

这样写会不会更好:

var a:Point = new Point(); 

在enterFrame函数外,再在enterFrame函数内写:

a.x = redClip.x

a.y = redClip.y

所以你正在重新使用变量引用的内存?

如果我对记忆的初步理解有误,请纠正我。

【问题讨论】:

    标签: flash actionscript-3 memory-management


    【解决方案1】:

    函数执行后 GC 不会立即回收内存,但只要发生扫描,Point 对象就有资格进行垃圾回收。 Flash GC 在需要时回收内存。

    您可以在函数外部声明 Point 对象,以便只创建一个对象,但是您必须记住在完成后销毁对它的任何引用。我认为任何效率提升都是微不足道的。

    【讨论】:

    • 为了清洁起见,我还是选择后一点。每帧创建一个新对象对我来说似乎很草率。
    • @MartyWallace,只是为对方辩护。创建外部可重用Point 引入了维护痛点;以及当事情变得更复杂时出现错误的可能性。当我们最小化共享状态时,我们会获得更大的灵活性;这只是重构代码时要担心的另一件事——为了什么好处,可以忽略不计甚至不存在的性能提升?并不是说没有时间和地点来做这件事! ;)
    • 这并不是为了提高性能。一遍又一遍地创建新对象的概念在我看来真的很混乱。此外,在课堂结束时创建deconstruct 函数或其他东西并掩盖所有这些东西并不难。
    • 感谢您的澄清 shanethehat。很高兴知道这些点会得到清理。只是出于好奇,有没有人知道 Point 对象大致有多大(它的类中有 3 个数字和几个函数)以及垃圾收集器以什么速率(每秒?)出现?
    猜你喜欢
    • 1970-01-01
    • 2021-09-17
    • 2021-12-16
    • 1970-01-01
    • 2011-01-29
    • 2011-05-08
    • 2016-02-04
    • 2012-09-27
    • 2011-06-26
    相关资源
    最近更新 更多