【发布时间】:2020-08-19 21:17:54
【问题描述】:
我正在 Unity 环境中进行一些视觉艺术研究。 我正在尝试实现与差分线增长非常相似的东西as explained here 但我主要担心的是,在算法的某个地方,每个节点都应该检查每个其他节点,看看它有多接近,并从所有这些靠近的粒子构造一个排斥力数组。
这是我的代码的 sn-p:
public void Differentiate()
{
int c = nodes.Count;
Vector3[] repulsionForces = new Vector3[c];
for (int i = 0; i < c ; i++)
{
// Construct nearbies
List<DifferentialNode> nearby = new List<DifferentialNode>();
foreach(DifferentialNode n in nodes)
{
float d = Vector3.Distance(n.position, nodes[i].position);
if (d < 5)
{
nearby.Add(n);
}
}
// Get Forces
Vector3 repulsionForce = nodes[i].RepulsionForce(nearby);
// Limit Forces
repulsionForce = Vector3.ClampMagnitude(repulsionForce, maxForce);
// Apply Multipliers
repulsionForce *= Repulsion;
// Put Forces into Array
repulsionForces[i] = repulsionForce;
}
for (int i = 0; i < c; i++)
{
nodes[i].applyForce(repulsionForces[i]);
nodes[i].update();
nodes[i].velocity = new Vector3(0, 0, 0);
}
这是我在 DifferentialLineNode 类中的 RepulsionForce() 函数
public Vector3 RepulsionForce(List<DifferentialNode> nearby)
{
Vector3 repulsionForce = new Vector3();
foreach (DifferentialNode n in nearby)
{
// calculate distance between both
float d = Vector3.Distance(n.position, this.position);
// calculate difference and divide by exp(d) to get less influence when far
Vector3 diff = ( this.position - n.position ) / (Mathf.Exp(d));
repulsionForce += diff;
}
repulsionForce /= (float)nearby.Count;
repulsionForce.Normalize();
return repulsionForce;
}
一旦我开始游戏,一切都会降到 1fps 以下,我认为嵌套循环是它的来源,因为它具有 n^n 的复杂性。我一直在研究 Octree / KdTree 实现,但找不到任何解释代码。还有其他路线吗?超过一个 ?可以任意组合吗?非常感谢
【问题讨论】:
-
您应该查看 Job 系统、ECS 和 Burst 编译器。这会加快速度,但遗憾的是,我对此知之甚少,所以我真的无法为您提供更多帮助。
标签: c# unity3d nested-loops kdtree