【发布时间】:2015-03-01 17:56:04
【问题描述】:
我正在开发一个系统,该系统将命令从 HashSet 分发到播放器。我想将一个命令分发给离命令最近的玩家。
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 是否抛出错误进行比较。
我将非常感谢任何提高此代码的整体速度或如何在 ThreadPool 中运行它的提示。如果需要,我还可以发布我为 Thread 尝试创建的 JobClass。
【问题讨论】:
-
所以你有 x 个玩家,每个玩家有 y 个命令,对吧?并且您想按...与某个点(例如相机)的距离来订购?
-
哦,看来我在这里不够清楚.. 我有 x 个玩家和 y 个命令。现在我只想为每个玩家分配一个命令。上面的代码只是将命令分配给一个玩家的部分。这在每个玩家的 foreach 中调用,并且一些不重要的条件检查是否还有命令和玩家要分配。播放器和命令都相互链接)。但是分配给命令的玩家应该是离它最近的玩家
-
命令从何而来?您不能在创建命令后立即分发命令以保存在它们的大列表中吗?
-
它们是从输入控制器创建的,当用户执行某些操作(鼠标单击)并被放入命令控制器的字典中时。该字典用于将命令分配给不同的优先级并作为队列工作。创建命令时无法分发命令,因为您一次最多可以创建 1000 个命令,并且只有 9 名玩家......该游戏是一个体素游戏,具有很多管理和战略影响.. 所以一个命令例如.可以挖某个区块
-
hmmm ok ...这个游戏听起来很酷:) ...所以你有一个带有位置的命令列表和一个带有位置的玩家列表,你需要以某种方式匹配它们.. . 有趣的问题... 他们是否必须在这一帧发生,或者您可以将工作分配给线程吗?
标签: c# performance unity3d