如何以一种好的方式获得最近的 PositionComponent?

How to get nearest PositionComponent in a good way?

我身边有一个“玩家”和几个“敌人”:

现在我只用一个循环来得到每一个距离:

  void fireBullet() {
    var enemies = gameRef.children.whereType<Enemy>();

    if (enemies.isEmpty) return;

    PositionComponent nearestEnemy = enemies.first;

    enemies.forEach((element) {
      if (element.distance(playerComponent) < nearestEnemy.distance(playerComponent)) {
        nearestEnemy = element;
      }
    });

    // fire bullet to enemy
  }

我认为这不是最佳解决方案。如果敌人太多,性能会下降。

有没有更好的方法获取最近的PositionComponent?

不幸的是,没有更好的built-in方法。

您可以对您的游戏进行一些改进,但这会产生很大的性能差异:

  • 使用distance2,因为这样它就不必在后台进行平方根运算了。
  • 保存最后的 distance 计算以避免重复计算。
  • 使用 query 而不是 whereType(查询被缓存)。

所以它会是这样的:

  void fireBullet() {
    var enemies = gameRef.children.query<Enemy>();

    if (enemies.isEmpty) return;

    var nearestEnemy = enemies.first;
    var nearestDistance = nearestEnemy.position.distance2(playerComponent);

    enemies.forEach((element) {
      final distance = element.position.distance2(playerComponent.position);
      if (distance < distanceNearest) {
        nearestEnemy = element;
        nearestDistance = distance;
      }
    });

    // fire bullet to enemy
  }

我相信在更新状态下此代码遇到性能问题之前,您会遇到其他性能问题。