我使用XML中定义的标准幻灯片动画来动画片段转换。大多数这些片段包含ListViews(但并非总是如此)。 90%的时间,动画流畅,流畅。每隔一段时间,就会出现口吃。检查logcat,当发生口吃时,总会发生GC:
D/dalvikvm(26619): GC_FOR_ALLOC freed 300K, 9% free 13820K/15044K, paused 40ms, total 40ms
(感觉奇怪的是它感觉它需要GC只需300 KB)
无论如何都要在动画中避免使用GC(之前或之后很好)。在动画之前调用System.gc()不是一个很好的选择,特别是因为不能保证何时进行垃圾收集。还有其他建议吗?
答案 0 :(得分:3)
你问的是错误的问题......如果问题是你的动画很笨拙,那么你应该问“我怎样才能深入了解实际发生的事情?” logcat中的一些GC_FOR_ALLOC
日志不足以分析此问题。如果您的应用有时会遇到性能问题,那不是因为您忘记拨打System.gc()
,相信我。 :)
显然,避免垃圾收集的最佳方法是减少应用程序中对象分配的数量......这是给定的。如果这些问题不是很明显,您可以使用DDMS中提供的“分配跟踪器”来进一步分析这些问题。
我还建议观看这些视频......它们非常好,让您更深入地了解Android的图形渲染管道是如何工作的(Romain Guy和Chet Haase也很热闹:P )。
最后,我建议您使用“设置 - >开发者选项”中的工具。查看Romain Guy的this blog post了解更多信息(请注意,帖子有点过时......从4.3开始,工具变得更容易使用......他们谈论对这些工具所做的更改上面链接的“Android图形性能”视频中的工具。如果您的目标是将动画设置为60fps或低于60fps,则Systrace和/或Profile GPU渲染特别有用。