It’s 6 AM and I was wondering how to solve the issue with the amount of draw calls in a system that utilises static imagery present all over a scene, like bullet holes in the wall or blood splattered after a kill. Most solutions for such problem resolved around just using the most straightforward way of handling this and did it through the Decal or SurfaceGui objects. Thing is, these objects are known for their draw call hungry nature, so something had to be done. Sure, part or instance pooling is a thing, but what if I want more?
Bullet holes or any static image is just an image, there are a lot of ways to render an image in Roblox, and one of them is through a particle from a ParticleEmitter object. It might seem silly at first, since all particles have a set Lifetime, they won’t last very long! Plus, you’d have to make a new emitter for every static image you want to keep alive, not solving the issue with draw calls.
But do you really need to do that?
A single ParticleEmitter object uses a single draw call for all of its particles, meaing even if there are 50 particles housed under a single emitter, they all will be rendered using 1 draw call for the object itself.
The issue with Lifetime can be solved using another property of the same object, the TimeScale property. Put short, it affects how fast the particle dies out, with the highest and standard value being set to 1.
But you can set it to 0. See where I’m going?
Now’s the plan, create a Part, put a ParticleEmitter inside it, set its Lifetime to a high value (just to be safe during testing) and its TimeScale value to 0. Using a script or the console, emit 100 particles from it. See if any of them disappear.
They don’t disappear.
Let’s emit 5000, like why not.
They don’t disappear!
What about performance?
This is crazy, I didn’t expect it to be this low. Still, it’s quite a lot of tris, but it’s such a miniscule issue in comparison to the amount of draw calls, which is the real bottleneck for performance (the usual budget for tris for an IPhone 6s is about 500 thousand), especially considering how the amount of tris will scale the same way for any other amount of particles, they’re just squares if you enable Wireframe Rendering mode.
How can we use this for stuff like bullet holes or blood splatter? Simple, we just move the emitter’s holder (which would be a Part or a global Attachment) to a needed location and emit a particle.
Am I going crazy? Does this really work? Do they really not disappear? Why has no one thought of this? Please reply if I’m wrong!
A simple solution to removing all of the particles would be to set their Lifetime property to a very small value and setting the TimeScale value back to 1 or just destroying the ParticleEmitter object.


