我的基本问题: System.totalMemory 可以不报告内存泄漏吗?
更新:虽然我的性能问题的根源从未得到完全验证,但它可能与 GPU/CPU 问题有关(正如@divillysausages 假设的那样),我无法在目标系统上轻松测量。在提出这个问题的当天,一个奇怪而经典的怪异错误似乎已经解决了。出于本问答的目的,我认为可以肯定地说 System.totalMemory 被准确报告。
背景:我正在开发 3 个全屏 Adobe Air 3 应用程序。这三个应用程序和三个 VLC 播放器在多屏 Windows 7 机器上不断运行。每个 AIR 应用程序都在六个 1080p 屏幕之一上全屏显示。AIR 应用程序使用 Robotlegs 1.5.2(带有 Lazy Mediation)、AS3 Signals(带有 Relaxed Signals)和我自己的实现共享方面的样板外壳:记录器、加载器、基本 UI、调度服务、配置解析器。我一直在有条不紊地对外壳进行压力测试,它看起来不错。所有三个应用程序都定期加载数据(大约 5 分钟)并更新它们的视图和自动压力测试显示加载器和解析器即使在受到更新的影响时也是内存安全的。初始化后创建的对象很少,
问题:在目标系统上运行几个小时后,动画重模块的渲染速率会受到影响。
这个问题显然是分层的,但我有点恼火,因为我一直在使用 Flash Builder Profilier 和 Mr Doobs Stats 工具进行分析,内存使用情况在分析期间似乎稳定得很好(即使 FB Profilier 对字符串做了一些奇怪的事情:请参阅我关于 FB Profiler 中字符串的其他问题)。动画繁重的应用程序启动时,它很快就达到了内存使用水平,并且动画性能仍然不错,然后我在几个小时后检查,动画断断续续,不规则,应用程序 UI 缓慢且无响应。其他两个应用程序(以低帧速率运行,没有动画)看起来相当不错,分别消耗相同和更多的内存。重新启动动画应用程序可解决此问题。
更多上下文:
动画繁重的应用程序将 stage.frameRate 调节在 15 到 40 之间,这取决于它是否正在制作动画 - 最初我认为恒定的帧速率会有所帮助,但后来我遇到了确保所有数据解析都发生在动画之前的麻烦开始防止动画想要在某种数据处理洪流中开始的竞争条件......我正在考虑使用恒定帧,但它似乎是一个远景
使用 Greensock 的 TweenMax 制作动画,最初发现我堵塞了内存泄漏(我自己的错误实现的一个案例)——目前 TimelineMax 和 TweenLite 实例是我不断创建和销毁的一件事,它们似乎 GC 就好了
很少创建新对象(基本上是没有事件侦听器且其值经常被覆盖的值对象)——没有循环创建/销毁显示对象
尽可能使用信号和回调而不是事件
通过尽可能多地共享和重用 Timer 对象并更多地使用它们来计时秒数,从而最大限度地减少 Timer 实例 (5-6)
使用 renderMode "auto" Adobe AIR:主窗口属性— 不确定我是否应该更改它以部署到 Windows 7 机器