【发布时间】:2020-12-20 14:43:00
【问题描述】:
我正在统一运行机器人模拟,其中 300 个机器人中的每一个都运行相同的脚本,并且我使用 RayCast 进行机器人之间的通信。每个机器人每 0.02 秒以 10 度增量投射 36 条光线,覆盖所有 360 度。这是使用RaycastCommand 完成的,因此它是并行完成的,不会导致任何性能问题。尝试处理 RayCast 数据时会出现问题。
我需要遍历每个结果并比较每个机器人脚本中的标签和 ID:
for(int k =0; k< results.Length; k++) // For every result
{
if(results[k].collider !=null) // Check if RayCast collision happened
{
if(results[k].collider.tag == "Robot") // Check that collision is with robot
{
var ID = results[k].collider.GetComponent<RobotControl>().ID; // Get The robot ID
if(!listID.Contains(ID)) // Check that it hasnt comunicated with that robot yet
{
listID.Add(ID);
Debug.DrawRay(origin + (0.55f* Directions[k]), Directions[k] * results[k].distance , new Color(Directions[k].x, Directions[k].y, Directions[k].z, 1));
// Grab important info here
}
}
}
}
主要问题是我无法使用IJobParallelFor,因为我正在访问对撞机并尝试读取标签,这是代码中降低我性能的部分,因为其他所有操作都是使用并行作业完成的。真正的问题是访问组件的成本很高。
关于如何使其更高效或以某种方式并行化的任何想法?
有没有办法访问GameObject 特定数据,例如 ID,而不访问它们的组件?
【问题讨论】:
标签: c# for-loop unity3d parallel-processing simulation