运行spine-flutter/Example中的Simple Animation(和原始Demo中的动画资源和骨骼一致),同样采用Flutter DevTools进行查看,主要的性能瓶颈集中在以下几个方面
- Spine 动画的渲染和更新:
SkeletonDrawable.update(占用大量CPU资源,用于更新骨骼动画状态)
AnimationState.apply(用于应用动画状态)
SpineFlutterBindings.spine_animation_state_apply(与Spine动画状态绑定的FFI调用开销较大)
SkeletonDrawable.renderToCanvas
_SpineRenderObject.paint(主要性能瓶颈,用于渲染Spine动画) - FFI调用:(FFI相关调用都显著占用CPU时间)
SpineFlutterBindings.spine_animation_state_apply
SpineFlutterBindings.spine_skeleton_drawable_render
- Spine 动画的渲染和更新:
为了对比FFI在其中的影响,对比运行spine-ios/Example中的Simple Animation,性能上有明显差距
- 动画运行期间CPU平均使用率30%-40%(对比flutter的50%-60%)
- 同样动画内存占有50M-60M(对比Flutter的250M-300M)
- 对比真机Webview 版本 cpu 5% 内存25.4M https://zh.esotericsoftware.com/files/runtimes/spine-ts/examples/canvas/
为什么spine-flutter对比纯ios的内存开销会差别如此之大?