- Home /
Question by
The-Gabo · Dec 12, 2019 at 02:55 PM ·
particlesoptimizationloop
Custom particle system loop optimization
Hi there,
I have a sort of custom particle system that takes an insane amount of calculation time by frames. With each loop, i calculate the target position of the particle, turn , and move it.
It's a very complex particle system, so there not much I can DELETE from the loop but :
I wanted to know if there was something terribly wrong in my loop that requires so much processing in the profiler, or if maybe there was another way to handle does kind of cases.
Here the part of the code that repeats every frame and a gif of the effect afterwards: Thanks in advance
public void UpdateBoids()
{
if (Vector3.Distance(rotationCenter.position, center.position) > triggerDistance)
{
return;
}
t = Time.deltaTime;
Vector3 centerPos = center.position;
Vector3 targetPos = centerPos;
Vector3 rotCenterPos = rotationCenter.position;
//
Vector3 boidPos;
Vector3 boidFrwd;
Vector3 camPos = CameraBehavior.Instance.GetTransform.position;
for (int rotationIndex = 0; rotationIndex < rotationAmounts; rotationIndex++)
{
int l = rotationIndex * boidsPerRotations;
for (int i = l; i < l + boidsPerRotations; i++)
{
// SELECT BOID //
b = _boids[i];
boidPos = b.position;
boidFrwd = b.forward;
// TRAIL //
if (followingTrail && trailIndexes[i] < trail_TargetBoids.trailPoints.Count)
{
targetPos = trail_TargetBoids.trailPoints[trailIndexes[i]];
if (Vector3.Distance(boidPos, targetPos) < distanceToFollowTrail)
++trailIndexes[i];
}
else
{
targetPos = centerPos;
}
// set boolds
nearRotationCenter = Vector3.Distance(boidPos, rotCenterPos) < rotationDistance;
// set rotation
if (nearRotationCenter)
{
// SET POSITION //
p = targetPos + Quaternion.AngleAxis(angles[i], rotationAxis[rotationIndex]) * (rotationDirections[rotationIndex] * distances[i]);
// SET SCALE //
b.localScale = Vector3.Lerp(b.localScale, initScale, scaleSpeed * t);
// LERP POS TO TARGET POINT
b.position = Vector3.Lerp(boidPos, p, moveSpeeds[i] * t);
spriteRenderers[i].transform.LookAt(camPos);
spriteRenderers[i].color = Color.Lerp(spriteRenderers[i].color, clear, t);
}
else
{
// SET POSITION //
p = targetPos + Quaternion.AngleAxis(angles[i], rotationAxis[rotationIndex]) * (rotationDirections[rotationIndex] * distances[i] * regroupToCenterAmount);
// SET SCALE //
b.localScale = Vector3.Lerp(b.localScale, targetScales[i], scaleSpeed * t);
// AIM TOWARD TARGET //
b.forward = Vector3.MoveTowards(boidFrwd, (p - boidPos), targetSpeed * t);
// MOVE TOWARD TARGET //
b.Translate(boidFrwd * moveSpeeds[i] * t, Space.World);
spriteRenderers[i].transform.LookAt(camPos);
spriteRenderers[i].color = Color.Lerp(spriteRenderers[i].color, initColor, t);
}
// ADVANCE ANGLES //
angles[i] += rotationSpeeds[i] * t;
}
if (!Player.Instance.boids.waveActive)
{
// ROTATION AXIS //
rAxis[rotationIndex] += new Vector3(0.15f, 0.5f, 1f) * Time.deltaTime;
rDir[rotationIndex] += new Vector3(1f, 0.15f, 0.5f) * Time.deltaTime;
rotationAxis[rotationIndex] = new Vector3(Mathf.Sin(rAxis[rotationIndex].x), Mathf.Sin(rAxis[rotationIndex].y), Mathf.Sin(rAxis[rotationIndex].z));
rotationDirections[rotationIndex] = new Vector3(Mathf.Sin(rDir[rotationIndex].x), Mathf.Sin(rDir[rotationIndex].y), Mathf.Sin(rDir[rotationIndex].z));
}
}
}
Comment