# GPU particle systems and targetStopDuration

**URL:** <https://forum.babylonjs.com/t/gpu-particle-systems-and-targetstopduration/60680>\
**Category:** Bugs\
**Created:** [September 27, 2025, 1:41pm UTC](https://forum.babylonjs.com/t/gpu-particle-systems-and-targetstopduration/60680 "2025-09-27T13:41:07Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![julien-moreau](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/julien-moreau/32/12070_2.png) [@julien-moreau](https://forum.babylonjs.com/u/julien-moreau)\
**Post date:** [September 27, 2025, 1:41pm UTC](https://forum.babylonjs.com/t/gpu-particle-systems-and-targetstopduration/60680/1 "2025-09-27T13:41:07Z")

</div>

Hey Bjs team!

I noticed 2 issues recently using GPU particle systems when setting “targetStopDuration”:

- The PS always returns “true” when calling `ps.isStarted()` even when the stop duration is reached and no particle drawn anymore. Maybe this is expected but this behavior is different from classic ParticleSystem implementation
- Once stop duration is reached, impossible to start the system again. The only ways is to set `_actualFrame = 0`. This behaviour is also from the one implemented in ParticleSystem class.

Here is a playground: [https://playground.babylonjs.com/#1ASENS#417](https://playground.babylonjs.com/#1ASENS#417)

- The first log attests the partcile system is started.
- The second one says it’s started but “\_stopped” is equal to “true”. Also, I try to start again the PS and nothing happens.

As it’s different from the ParticleSystem class implementation I report it as a bug. Don’t hesitate if I’m wrong 🙂

Again thanks a lot for you help ❤

---

<div class="post-metadata">

**Author:** ![Evgeni\_Popov](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/evgeni_popov/32/4432_2.png) [@Evgeni\_Popov](https://forum.babylonjs.com/u/Evgeni_Popov)\
**Post date:** [September 29, 2025, 7:30am UTC](https://forum.babylonjs.com/t/gpu-particle-systems-and-targetstopduration/60680/2 "2025-09-29T07:30:56Z")

</div>

> [@julien-moreau](#):
>
> The PS always returns “true” when calling `ps.isStarted()` even when the stop duration is reached and no particle drawn anymore. Maybe this is expected but this behavior is different from classic ParticleSystem implementation

I think it’s because of:

> [@GPU Particle System - Particles remain alive after stop()](https://forum.babylonjs.com/t/gpu-particle-system-particles-remain-alive-after-stop/42361/4):
>
> This is expected: GPU particles cannot be removed from the CPU (well we can but it is overly expensive). Hence the choice to simply skip the stopped ones By the way, it does not generate additional draw calls as the GPU particles are all rendered in one draw call wink

> [@GPU particle system start delay if active particles is "full"](https://forum.babylonjs.com/t/gpu-particle-system-start-delay-if-active-particles-is-full/60561):
>
> Hi everyone! I’m struggling a bit with my gun muzzle effect, trying to use particles with that. I have a pooling system for particle systems, so my muzzle gpu particle system is stopped after a really small time and then reactivated some time later when a gun is shot again. However, I struggle to start the system exactly when the start function is called. I do preheat the system as well. I don’t really know if I’ve understood something wrong or where the problem is face_with_peeking_eye Her…

Particles are not removed from a GPU particle system, they are just skipped when they are not alive anymore, so `isStarted` for a GPU PS always stays **true** after it has been started.

> [@julien-moreau](#):
>
> Once stop duration is reached, impossible to start the system again. The only ways is to set `_actualFrame = 0`. This behaviour is also from the one implemented in ParticleSystem class.

This one is probably a bug, as `this._actualFrame = 0;` is done in the `start` function of `ThinParticleSystem` but not in `GPUParticleSystem`:

> <https://github.com/BabylonJS/Babylon.js/pull/17207>
>
> See https://forum.babylonjs.com/t/gpu-particle-systems-and-targetstopduration/60…680

Thanks for reporting!

(note that you can do `particleSystem.isStopped()` instead of `particleSystem["_stopped"]`)

---

<div class="post-metadata">

**Author:** ![julien-moreau](https://sea2.discourse-cdn.com/flex024/user_avatar/forum.babylonjs.com/julien-moreau/32/12070_2.png) [@julien-moreau](https://forum.babylonjs.com/u/julien-moreau)\
**Post date:** [September 29, 2025, 8:38am UTC](https://forum.babylonjs.com/t/gpu-particle-systems-and-targetstopduration/60680/3 "2025-09-29T08:38:04Z")

</div>

I understand, thanks a lot!!  
And in the editor I’ll test “isStopped()” instead of “isStarted()” for both as it looks like it works the same.

Thanks for your fix! ❤
