Flutter高效ECS管理插件fast_ecs的使用

Flutter高效ECS管理插件fast_ecs的使用

Fast ECS

简单且高效的实体组件系统(ECS)库,用Dart编写。

CPU Flame Chart

演示了在Nexus 5 (2014)设备上运行Android 6.0.1系统时,1024个实体旋转的性能。

  • 设备:Nexus 5 (2014)
  • Android版本:6.0.1
  • 插件版本:fast_ecs 0.0.1
  • 总时间:10500毫秒
  • 实体数量:1024个

RotationSystem

void update(double deltaTime, SetEntity entities) {
  for (var i = 0; i < entities.size; i++) {
    Entity entity = entities[i];
    TransformComponent transform = transformComponents[entity];
    VelocityComponent rotation = velocityComponents[entity];
    transform.rotation += rotation.velocity * deltaTime;
    transform.dirty = true;
  }
}

SpriteSystem

void updateSprite(TransformComponent transform, SpriteComponent sprite) {
  var textureRegion = sprite.textureRegion;
  if (transform.dirty && textureRegion != null) {
    var scos = cos(transform.rotation) * transform.scale;
    var ssin = sin(transform.rotation) * transform.scale;
    var tx = -scos * textureRegion.anchorX + ssin * textureRegion.anchorY;
    var ty = -ssin * textureRegion.anchorX - scos * textureRegion.anchorY;
    sprite.transformData.set(scos, ssin, tx, ty);
    transform.dirty = false;
  }
}

历史背景

灵感来源于资源A SIMPLE ENTITY COMPONENT SYSTEM (ECS) [C++]


Fast ECS 示例

Components

创建一个 VelocityComponent

class VelocityComponent extends Component {
  double velocity = 2;
}

创建一个 TransformComponent

class TransformComponent extends Component {
  double rotation = 0.0;
  double scale = 0.5;
}

Systems

创建一个 RotationSystem

class RotationSystem extends UpdateEcsSystem {
  late List<TransformComponent> transformComponents; // 快速链接
  late List<VelocityComponent> velocityComponents; // 快速链接

  @override
  void init(ecs, Signature signature) {
    transformComponents = ecs.getComponentList<TransformComponent>();
    velocityComponents = ecs.getComponentList<VelocityComponent>();
  }

  @override
  void update(double deltaTime, SetEntity entities) {
    for (var i = 0; i < entities.size; i++) {
      Entity entity = entities[i];
      TransformComponent transform = transformComponents[entity];
      VelocityComponent velocity = velocityComponents[entity];
      transform.rotation += velocity.velocity * deltaTime;
    }
  }
}

Entity Component System

创建一个 Ecs

Ecs ecs = Ecs(maxEntity: maxEntity, maxComponents: 8);
// 注册组件
ComponentId transformId = ecs.registerComponent<TransformComponent>((index) => TransformComponent(), maxEntity);
ComponentId velocityId = ecs.registerComponent<VelocityComponent>((index) => VelocityComponent(), maxEntity);
var rotationSystemSignature = ecs.createSignature([transformId, velocityId]);
// 使用签名注册RotationSystem
ecs.registerSystem<RotationSystem>(() => RotationSystem(), signature: rotationSystemSignature);

Entity

创建一个 Entity

Entity entity = ecs.createEntity();
ecs.addComponent(transformId, entity);
ecs.addComponent(velocityId, entity);

Usage

更新 ECS

ecs.update(deltaTime);

渲染 ECS

void _render(EcsSystem system, Uint16Set entities) {
  if (system is DrawSystem) {
    system.draw(batch, entities);
  }
}

void render() {
  ecs.forEach(_render);
}

更多关于Flutter高效ECS管理插件fast_ecs的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter高效ECS管理插件fast_ecs的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用fast_ecs(一个高效的实体组件系统管理插件)的示例代码。fast_ecs可以帮助你高效地管理游戏或应用中的实体和组件。

首先,确保你已经在pubspec.yaml文件中添加了fast_ecs依赖:

dependencies:
  flutter:
    sdk: flutter
  fast_ecs: ^最新版本号

然后运行flutter pub get来获取依赖。

示例代码

1. 定义组件

首先,定义一些组件。组件通常是一些简单的数据类。

import 'package:fast_ecs/fast_ecs.dart';

class Position extends Component {
  double x;
  double y;

  Position(this.x, this.y);
}

class Velocity extends Component {
  double dx;
  double dy;

  Velocity(this.dx, this.dy);
}

2. 创建系统

系统负责处理组件之间的交互和逻辑。

import 'package:fast_ecs/fast_ecs.dart';
import 'package:fast_ecs_example/components.dart'; // 假设组件定义在这个文件中

class MovementSystem extends System {
  @override
  void update(World world, double deltaTime) {
    world.forEach<Position, Velocity>((entity, position, velocity) {
      position.x += velocity.dx * deltaTime;
      position.y += velocity.dy * deltaTime;
    });
  }
}

3. 初始化世界并添加实体

在Flutter应用中初始化ECS世界并添加一些实体。

import 'package:flutter/material.dart';
import 'package:fast_ecs/fast_ecs.dart';
import 'package:fast_ecs_example/components.dart'; // 假设组件定义在这个文件中
import 'package:fast_ecs_example/systems.dart'; // 假设系统定义在这个文件中

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter ECS Example'),
        ),
        body: EcsExample(),
      ),
    );
  }
}

class EcsExample extends StatefulWidget {
  @override
  _EcsExampleState createState() => _EcsExampleState();
}

class _EcsExampleState extends State<EcsExample> with SingleTickerProviderStateMixin {
  late World world;
  late MovementSystem movementSystem;

  @override
  void initState() {
    super.initState();

    // 初始化世界
    world = World();

    // 创建系统
    movementSystem = MovementSystem();
    world.addSystem(movementSystem);

    // 创建并添加实体
    Entity player = world.createEntity();
    player.addComponent(Position(0.0, 0.0));
    player.addComponent(Velocity(1.0, 1.0));

    // 开始游戏循环(这里使用Flutter的TickerProvider进行简单模拟)
    Ticker _ticker = createTicker(() {
      world.update(0.016); // 假设每帧更新时间为16毫秒(60FPS)
      setState(() {}); // 触发UI更新(实际UI更新逻辑需根据具体需求实现)
    });
    _ticker.start();
  }

  @override
  void dispose() {
    // 停止游戏循环并清理资源
    world.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    // 这里应该根据你的ECS状态更新UI
    // 例如,根据player的Position组件更新一个精灵的位置
    return Center(
      child: Text('Player Position: (${world.getEntity(0).getComponent<Position>()?.x ?? 0.0}, ${world.getEntity(0).getComponent<Position>()?.y ?? 0.0})'),
    );
  }
}

注意事项

  1. UI更新:上面的示例代码中,UI更新是通过setState触发的,但实际项目中可能需要更复杂的逻辑来同步ECS状态和UI。
  2. 资源管理:确保在不需要时正确释放ECS世界的资源。
  3. 性能优化fast_ecs已经为你做了许多性能优化,但根据具体需求,你可能还需要进一步调整系统更新频率和组件管理方式。

这个示例展示了如何在Flutter项目中使用fast_ecs进行基本的ECS管理。根据具体需求,你可以进一步扩展组件、系统和实体。

回到顶部