如何以一种好的方式获得最近的 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
}
我相信在更新状态下此代码遇到性能问题之前,您会遇到其他性能问题。
我身边有一个“玩家”和几个“敌人”:
现在我只用一个循环来得到每一个距离:
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
}
我相信在更新状态下此代码遇到性能问题之前,您会遇到其他性能问题。