【问题标题】:(AS3) Does setting variables to private help garbage collection?(AS3) 将变量设置为私有有助于垃圾收集吗?
【发布时间】:2013-01-25 08:21:41
【问题描述】:

这里是新手程序员。

我目前正在编写一个简单的游戏,其标题屏幕和主游戏循环位于单独的“关键帧”中(这是在 CS6 中)。一旦我从标题屏幕过渡到游戏关键帧,我担心按钮/电影剪辑/变量会一直存在并浪费内存+使屏幕混乱。

如果我将变量/函数设置为“私有”,这会帮助垃圾收集器处理它们吗?我应该如何“清除屏幕”并确保我没有浪费/泄漏内存?

我一直在阅读的学习 AS3 的教程或书籍都没有真正涵盖这个主题,如果有任何好的指南或明显的提示我错过了就 AS3 中的内存管理最佳实践而言,我很感兴趣在看到他们。到目前为止,我学到的唯一一件事是我应该手动将所有事件侦听器设置为弱引用。

额外问题:我正在使用全屏位图并在其上显示内容。如果我每帧将数十个对象blitting 到屏幕上,我就不需要担心被“覆盖”的blitted“精灵”,不是吗?我希望位图只有一个像素厚,而不仅仅是堆叠在一起。

【问题讨论】:

  • 如果您使用 CS6 中的时间轴来编写代码,您可能无论如何都不能使用访问修饰符。它们仅在使用自定义类且大多数基于时间轴的代码不使用自定义类时可用

标签: actionscript-3 memory memory-management actionscript garbage-collection


【解决方案1】:

首先,您可以完全控制您的资源的唯一方法是,如果您将时间线保留为预期用途,创建并以 swc 或 swf 格式导出资产,您可以嵌入前者并嵌入或加载后者。

您应该做的是学习如何以面向对象的方式进行开发,从 Document 类开始(当您使用 CS6 时),然后使用一系列已定义任务的类来构建您的游戏。使用类可以提高整个游戏的可重用性。根据复杂程度,我会考虑使用 PureMVC 或 Robot leg 之类的框架。

flash 中的垃圾收集是标记和清除,这意味着您必须取消引用所有对象,这通常从删除关联的侦听器、计时器以及对它们的任何进一步引用开始,例如。从数组或对象哈希中清除。最后,您将有问题的对象设置为 null ,这使其“符合”垃圾收集条件,但实际上并不能保证它。 Flash 会在它认为合适的时候进行清理。

就个人而言,如果你能掌握 Flash Builder,它有一个很棒的内存管理分析工具,当你使用上面提到的 OOP 进行开发时,你可以使用这个工具来查看你游戏中存在的所有实例。现在这里的好处是您可以及时进行内存快照,并比较它们以查看哪些对象徘徊并导致内存泄漏。有一个垃圾收集按钮,您应该在捕获快照之间调用它,这仅在您正在开发时可用,尽管使用 Adob​​e AIR 您可以手动强制 gc 调用。

关于你的额外问题,我不确定你是如何做这个 blitting 的,如果你在舞台上添加对象,这会增加内存,你无法避免这种情况。你所说的 1px 厚的是 flash 渲染的内容,你可以通过右键单击舞台并选择重绘区域选项来查看正在重绘的内容,看到一个红色框显示 flash 必须重绘的内容,它只会重绘它需要的内容到,这对于检查您的帧速率是否受到影响很有用。

总结一下:

考虑使用 Flash CS6 创建资源。

了解 Actionscript 3 中的面向对象编程。

考虑在 Flash Builder(或免费的 Flash Develop)中进行开发。

OOP 将帮助组织和取消引用垃圾收集的对象。

我希望这对您的游戏有所帮助并祝您好运。

【讨论】:

    猜你喜欢
    • 2018-09-06
    • 2015-11-13
    • 2011-11-17
    • 2011-09-28
    • 2010-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多