SPS is an amazing and really powerful tool in the hands of a Babylon.js developer. I hadn’t used it in a while, so I completely forgot about it. I was pretty annoyed  when I discovered SPS after I had already spent a noticeable amount of time writing my own simpler version for this demo: BabylonJS Dude Particle Shooter Demo
 when I discovered SPS after I had already spent a noticeable amount of time writing my own simpler version for this demo: BabylonJS Dude Particle Shooter Demo
I’ll definitely add it to the list. Thanks for reminding me!
As for choosing between SPS and thin instances: they’re quite different.
SPS creates one big mesh by combining the “particles.” Thin instances, on the other hand, use a single prefab geometry and multiple transform matrices.
SPS offers a lot of helper functions to manage particles. With thin instances, you have to manage everything manually. It’s more low-level, but with no overhead and honestly, I kinda like that.
To sumarize from my point of view: SPS is more convenient. Thin instances require more effort to manage but are faster on the CPU side. For static meshes thin instances are the best option in my opinion. I’m still using my Thinnizator for converting meshes to thin instances in my projects. I’m currently about to release a new Thinnizator Playground and I will also open source the newest Thinnizator class which takes care of “thinnizing” the whole scene.
I’m not sure which is faster on the GPU side though.
If anyone has insights on that, feel free to share your two cents!
I used to use the Babylon.js 2D GUI for rendering a lot of highly decorated badge elements linked to meshes. But I ended up switching to plain <div>s because they performed better, especially when the engine adapts to the device pixel ratio (DPR). That might not always be the case, depending on the use case, but if you’re experiencing low FPS due to lots of GUI controls, trying the <div> approach is definitely worth it.
I’m surprised that Mesh.mergeMeshes still produces one draw call per mesh — Playground. If I recall correctly, I used this function in the past and it worked properly, just one draw call at the end.
EDIT: This is not the case. See post #16.
As a workaround, you can use the mergeMeshes function from the docs to achieve single draw call rendering — Playground. It seems a bit buggy. I’m not the author, but I might look into it later, unless someone else with more free time wants to take care of it. 
EDIT: working custom merge function. See post #16.
Buggy custom mergeMeshes function result:
TBH I don’t have much experience with optimizing armatures but the docs should be usefull on this topic.
2D particles - don’t have a clue but I think GPU particles performs pretty fast already
@cyborg_ean Thank you!
