如何在 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 是一种垃圾收集语言,一旦不再有对对象的引用,它将自动垃圾收集未使用的对象。
但是,Sprite
s 有点特殊,因为它们中有加载的图像。在 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
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 是一种垃圾收集语言,一旦不再有对对象的引用,它将自动垃圾收集未使用的对象。
但是,Sprite
s 有点特殊,因为它们中有加载的图像。在 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