如何在 Flutter Flame 中销毁精灵对象?

How to destroy sprite objects in Flutter Flame?

removeFromParent 是否销毁对象?我的意思是垃圾收集它,我正在寻找销毁方法但找不到。

更新:

import 'package:flame/components.dart';

class Enemy extends SpriteAnimationComponent with HasGameRef {
  @override
  Future<void>? onLoad() async {
    position = Vector2(200, 100);
    size = Vector2(100, 100);

    var spriteAnimationData = SpriteAnimationData.sequenced(
      amount: 12,
      stepTime: 0.05,
      textureSize: Vector2(30, 30),
    );

    animation =
        await gameRef.loadSpriteAnimation('enemy/pig.png', spriteAnimationData);
    anchor = Anchor.center;

    return super.onLoad();
  }

  @override
  void update(double dt) {
    position += Vector2(-2, 0);

    if (position.x < -20) {
      removeFromParent();
    }  

    super.update(dt);
  }
}

由于 Dart 是一种垃圾收集语言,一旦不再有对对象的引用,它将自动垃圾收集未使用的对象。

但是,Sprites 有点特殊,因为它们中有加载的图像。在 Flame 1.0.0 中,图像缓存(或精灵 class)在清除时不会调用这些图像的 dispose(但在 main 上,在下一个版本中,这将完成)。

因此,要正确释放内存,您必须在删除 SpriteComponent 后调用 image.dispose(),您可以在 onRemove 中执行 sprite.image.dispose() SpriteComponent 例如,或在删除后调用 spriteComponent.sprite.image.dispose()

编辑:由于问题现已更新。

要对加载到 SpriteAnimationComponent 中的所有 Image 调用 dispose,您必须执行如下操作:

component.animation.frames.forEach((f) => f.sprite.image.dispose());

由于这些图像也被加载到图像缓存中,因此当您在下一个版本中删除条目(或清除整个缓存)时,它们也会被删除。

参考:https://api.flutter.dev/flutter/dart-ui/Image/dispose.html