gpt4 book ai didi

c# - 使用 Vector3.Distance 的性能问题

转载 作者:太空宇宙 更新时间:2023-11-03 21:23:35 25 4
gpt4 key购买 nike

我正在开发一个系统,该系统正在将命令从 HashSet 分发到 Player。我想将命令分发给距离命令最近的玩家。

void AssignCommand(Player player, HashSet<Command> commandList) {
//Player assigned;
float min = float.MaxValue;
float dist;

foreach(Command command in commandList) {
dist = Vector3.Distance(command.Position, player.Position);
if(dist < min) {
//check if command already assigned to another player
assigned = command.assigned;
if(assigned != null) {
//reassign when distance is smaller
if(dist < command.Distance(assigned)) {
//mark previously assigned command as unassigned
if(player.activeCommand != null) player.activeCommand.assigned = null;
player.activeCommand = command;
command.assigned = player;
min = dist;

assigned.activeCommand = null;
AssignCommand(assigned, commandList);
}
}
else {
if(player.activeCommand != null) player.activeCommand.assigned = null;
player.activeCommand = command;
command.assigned = player;
min = dist;
}
}
}
}

这段代码的问题是,如果 HashSet 中有很多命令,它会花费相当长的时间,并且在我的机器上帧率从 ~60 fps 下降到大约 ~30 fps。这并不奇怪,因为 Vector3.Distance 方法只是为 (every player) * (every command) 调用,这太多了。我现在正在寻找一种方法来以某种方式减少调用次数以提高性能。这里有什么想法吗?

我也试过在不同的线程中运行这段代码,但我放弃了,因为这正在改变并且使用了太多的线程不安全值。我最近的尝试让我检查 assigned != null 是否抛出比较错误。

我将非常感谢任何提示,无论是提高这段代码的整体速度还是如何在线程池中运行它。如果需要,我还可以发布我为 Thread 尝试创建的 JobClass。

最佳答案

所有线程解决方案和优化都很好,但您要记住的最重要的事情(无论是现在还是将来)是:不要使用 Vector3.DistanceVector3.magnitude 为此,永远。它们效率低下。

相反,使用 Vector3.sqrMagnitude,这是相同的东西(用于距离比较),没有 sqrt(最昂贵的部分)。

另一个优化是编写您自己的(平方)距离计算,如果您知道您不关心垂直距离,则丢弃 y 值。我的距离比较代码很慢,所以我非常仔细地测试了这个,发现这是最快的方法(特别是如果你不关心垂直位置):(编辑:这是 2015 年最快的。测试自己在现代上最快的代码团结。)

            tempPosition = enemy.transform.position; // declared outside the loop, but AFAIK that shouldn't make any difference
float xD = targetPosition.x - tempPosition.x;
float yD = targetPosition.y - tempPosition.y; // optional
float zD = targetPosition.z - tempPosition.z;
float dist2 = xD*xD + yD*yD + zD*zD; // or xD*xD + zD*zD

编辑:另一个优化(您可能已经在做)是仅在玩家移动时重新计算。我喜欢这个,因为它根本不会损害数据。

关于c# - 使用 Vector3.Distance 的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28796990/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com