From 37d0c4b7117dab4b1009bb96d648d851fcc6978e Mon Sep 17 00:00:00 2001 From: mob-sakai Date: Wed, 15 Jun 2022 09:09:56 +0900 Subject: [PATCH] refactor --- Scripts/UIParticleRenderer.cs | 34 +++++++++++++--------------------- Scripts/Utils.cs | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 21 deletions(-) diff --git a/Scripts/UIParticleRenderer.cs b/Scripts/UIParticleRenderer.cs index e2d5f47..638ec0a 100644 --- a/Scripts/UIParticleRenderer.cs +++ b/Scripts/UIParticleRenderer.cs @@ -14,7 +14,7 @@ namespace Coffee.UIExtensions internal class UIParticleRenderer : MaskableGraphic { private static readonly CombineInstance[] s_CombineInstances = new CombineInstance[] { new CombineInstance() }; - private static ParticleSystem.Particle[] s_Particles = new ParticleSystem.Particle[2048]; + //private static ParticleSystem.Particle[] s_Particles = new ParticleSystem.Particle[2048]; private static readonly List s_Materials = new List(2); private static MaterialPropertyBlock s_Mpb; private static readonly List s_Renderers = new List(); @@ -401,22 +401,19 @@ namespace Coffee.UIExtensions { // Update particle array size and get particles. var size = _particleSystem.particleCount; - if (s_Particles.Length < size) - { - s_Particles = new ParticleSystem.Particle[Mathf.NextPowerOfTwo(size)]; - } - _particleSystem.GetParticles(s_Particles, size); + var particles = ParticleSystemExtensions.GetParticleArray(size); + _particleSystem.GetParticles(particles, size); // Resolusion resolver: // (psPos / scale) / (prevPsPos / prevScale) -> psPos * scale.inv * prevPsPos.inv * prevScale var modifier = psPos.GetScaled(scale.Inverse(), _prevPsPos.Inverse(), _prevScale); for (var i = 0; i < size; i++) { - var particle = s_Particles[i]; + var particle = particles[i]; particle.position = particle.position.GetScaled(modifier); - s_Particles[i] = particle; + particles[i] = particle; } - _particleSystem.SetParticles(s_Particles, size); + _particleSystem.SetParticles(particles, size); // Delay: Do not progress in the frame where the resolution has been changed. _delay = true; @@ -483,22 +480,17 @@ namespace Coffee.UIExtensions diffPos.y *= 1f - 1f / Mathf.Max(0.001f, scale.y); diffPos.z *= 1f - 1f / Mathf.Max(0.001f, scale.z); - var count = _particleSystem.particleCount; - if (s_Particles.Length < count) + var size = _particleSystem.particleCount; + var particles = ParticleSystemExtensions.GetParticleArray(size); + _particleSystem.GetParticles(particles, size); + for (var i = 0; i < size; i++) { - var size = Mathf.NextPowerOfTwo(count); - s_Particles = new ParticleSystem.Particle[size]; - } - - _particleSystem.GetParticles(s_Particles); - for (var j = 0; j < count; j++) - { - var p = s_Particles[j]; + var p = particles[i]; p.position += diffPos; - s_Particles[j] = p; + particles[i] = p; } - _particleSystem.SetParticles(s_Particles, count); + _particleSystem.SetParticles(particles, size); Profiler.EndSample(); } } diff --git a/Scripts/Utils.cs b/Scripts/Utils.cs index 934b7a7..d091089 100644 --- a/Scripts/Utils.cs +++ b/Scripts/Utils.cs @@ -71,6 +71,21 @@ namespace Coffee.UIParticleExtensions public static class ParticleSystemExtensions { + private static ParticleSystem.Particle[] s_TmpParticles = new ParticleSystem.Particle[2048]; + + public static ParticleSystem.Particle[] GetParticleArray(int size) + { + if (s_TmpParticles.Length < size) + { + while(s_TmpParticles.Length < size) + { + size = Mathf.NextPowerOfTwo(size); + } + s_TmpParticles = new ParticleSystem.Particle[size]; + } + return s_TmpParticles; + } + public static bool CanBakeMesh(this ParticleSystemRenderer self) { // #69: Editor crashes when mesh is set to null when `ParticleSystem.RenderMode = Mesh`