Corona Geek #40 – 内存管理、Google IO 和呆伯特

Corona Geek #40 – 内存管理、Google IO 和呆伯特

Corona Geek本周我们和 Ed MaurinaGerald BaileyJesse Warden、 Matthew Chapman、和 Richard Harris 一起讨论了 Corona SDK 中的内存管理。Ed 在我们之前讨论 Storyboard 的 Hangout 之后创建了一个示例应用程序,他出色地解释了这个示例应用程序。他的应用程序演示了在开发的不同阶段将对象设置为 nil 时内存是如何受到影响的。Ed 同意在 GitHub 上发布他的代码,因此一旦可用,我们将发布他的代码链接。我们还谈到了 Google IO 的公告、正在进行的呆伯特竞赛以及COPPA 隐私政策

Corona Labs T 恤衫得主

祝贺 Theo Rushin, Jr. 赢得本周的 Corona Labs T 恤衫。为了有机会赢得奖品,请在 TwitterFacebook 上关注 Corona Geek,并填写Corona Geek 赠品表格

 

感谢您的收看,我们下周的 Corona Geek Hangout 再见!

记得订阅

Charles McKeever
[email protected]

Charles McKeever 是一位终身计算机极客,他喜欢探索各种技术,以了解它们的工作原理、如何将它们组合在一起以及如何利用它们来推动创业活动。

7 条评论
  • Derek J
    发布于 5 月 21 日 08:27

    非常有信息量(而且很及时)。我刚开始研究 Storyboard 和内存管理。有没有机会获得使用的测试应用程序代码的链接?

    • Derek J
      发布于 5 月 21 日 08:28

      顺便说一句,我无法提交评论,除非输入网站,尽管该表单没有将其标记为必填项。

    • Charles McKeever
      发布于 5 月 21 日 08:32

      您好 Derek J。感谢您收看节目。Ed 应该很快就会发布该应用程序。准备好后,链接将添加到帖子中。

  • Ed Maurina
    发布于 5 月 21 日 13:47

    您好!我本周慢如糖浆,但这是我之前发送给 Charles 和其他人的应用程序的直接下载链接,在之前的节目之后

    http://downloads.roaminggamer.com/coronageek/CoronaGeekAfterTalk.zip

  • Derek J
    发布于 5 月 23 日 07:54

    感谢各位先生。非常感谢。

  • Ed Maurina
    发布于 5 月 24 日 12:11

    您好。这是关于示例代码 (CoronaGeekAfterTalk.zip) 的由来以及它所做的事情的快速摘要。

    代码的由来
    ====================
    在之前的 CoronaGeek Hangout 中,提出了以下问题

    问题 #1 – 如果我在场景中有对对象的本地引用,然后场景被清除(使用 storyboard 时),会发生什么情况?本地引用会被清理掉吗?还是我会丢失那些内存?

    问题 #2 – 有没有更好/更简单的方法来处理 Storyboard 场景中对对象的本地引用?

    问题 #3 – 如果我创建显示对象并添加事件侦听器,我是否必须稍后删除它们,还是当对象被销毁/删除时,侦听器会自动删除?

    最初,我的答案是

    #1 – 不会,本地引用不会被清理掉。那些内存会丢失。
    #2 – 是的,有一种比使用本地变量更好的方法。将对象的句柄存储在场景的组对象上。
    #3 – 不确定。我认为您以前必须删除侦听器,但可能已经更改了。

    节目结束后,我想,“嗯...我应该测试一下我的答案。”所以,我花了一点时间,拼凑了 CoronaGeekAfterTalk.zip 中找到的应用程序。

    代码/应用程序的作用(以及如何使用它)
    =================================
    CoronaGeekAfterTalk.zip 中的代码包含六 (6) 个执行以下操作的示例场景

    1. 创建一个空白场景(几乎没有内容),以显示一个(大部分)空场景使用了多少内存。

    2. 创建一个包含大约 23,000 个图像的场景,并将对每个图像的引用存储在表“imageHandles”中。然后,当场景在 scene:destroyScene() 中被清除时,该表设置为 nil,实际上是 nil 了引用。

    3. 与 #2 相同,但不 nil 该表。

    4. 与 #2 相同,但不是本地表,而是将该表附加到 storyboard 场景管理器提供的组中(请参阅 scene:createScene() 和 scene:enterScene())。当该组被 storyboard 删除时,此表将自动删除。关于此示例,需要理解的重要一点是,我们可以随时引用对象引用,但我们不再负责将其设置为 nil。

    5. 在此示例中,我创建了 23,000 个图像,并将一个唯一生成的事件侦听器函数附加到每个图像。我这样做是为了占用尽可能多的内存。需要明确的是,每个对象都有自己的触摸函数,并且对象并非都共享一个函数,这将是执行此操作的有效方式。在此示例中,当清除发生时,我通过迭代图像句柄并调用“obj:removeEventListener()”来删除所有侦听器。

    6. 与 #5 相同,但我不会手动删除事件侦听器。

    请注意:#5 和 #6 使用来自 #4 的“改进的”句柄跟踪技术。即,场景被清除时自动设置为 nil。

    要运行示例,请执行以下操作
    1. 在模拟器中加载它。
    2. 在主菜单中观察主内存和纹理内存的“正在使用”值。
    3. 单击 6 个示例按钮之一以运行该示例。
    4. 观察运行示例时主内存和纹理内存的“正在使用”值。
    5. 单击后退按钮(所有场景都有一个)。
    6. 在主菜单中观察主内存和纹理内存的“正在使用”值。

    此时,您应该能够看到以下内容

    – 内存已(大部分)被清理干净,与我们开始时相同,

    – 内存未被清理干净。

    您可以根据需要多次重新运行测试,但我建议在不同的场景测试之间重新启动模拟器。

    最终结果
    ==========
    问题 #1 – 正确。本地引用不会被清理掉,并且存在内存泄漏。

    问题 #2 – 有趣。大部分内存被清理干净了,但始终有少量内存没有被清理干净。但是,没有泄漏。由于某种原因,Lua 正在延迟内存清除和可用空间合并。

    问题 #3 – 有趣而且很棒。当对象被删除时,Corona 会自动清除与侦听器关联的内存。这使得编码更快更容易。

    最终说明
    =========

    我忘了提这一点,但在 mainMenu.lua 中,你会注意到每次我们进入场景时,我都会调用 'storyboard.purgeAll()' 来强制删除所有非活动场景。如果我不这样做,这个应用将不会进行任何内存清理,因为我有足够的内存来保存内存中的非活动场景。

  • Ed Maurina
    发布于 13:56, 6月13日

    大家好!我已将文件从我的网站移至 GitHub

    请从 GitHub 下载。谢谢!

    https://github.com/roaminggamer/RG_FreeStuff/tree/master/CoronaGeekAfterTalk

发表评论