Every single particle's location?


Before digging deeply in the code, I would suggest your advise…

Can you advise me please the best (proper) way to get location of every single particle in active level? Is it possible at all (with code modification)?

I would distribute a render between couple of PCs. But I have the particles in scene. So I am thinking to run my level on “server” machine, get and save all particle attributes (current location, size etc) per frame and then to run render process on slave PCs. They will not simulate particles but simply load particle data from file, apply it per tick and then render frame out.

Am I right or maybe you can advise a better way for UE?

Thank you in advance!

Are you talking about Particle Systems as in the Components, or are you talking about the individual sprites within various particle systems? The first is relatively easy to do, but the second is very hard. It’s relatively easy to get the data out of the particle simulation, but the per-frame bandwidth to send that kind of data over a network will be borderline insane. It’ll also slow the simulation down if those locations etc are modifiable, the particle engine is optimized to run as quickly as possible so it’ll be a very expensive operation in comparison.

This certainly isn’t something you can do if you want it to work in realtime, so what’s the reason for doing this? Are you trying to replicate particles over a network?

As far as I get the idea - He want synchronise the particles, not the particle systems.

If my guess is right, you should run simulation on each client and provide only random seed from server to each particle system on each client(preferably on initial state). This save you a huge amount of bandwidth. But there one problem - float point calculation error in long run will desynchronise your clients.

Exactly, D.L.S.

Ideally I would just distribute the rendering between couple PCs. And I need to have exact result on each UE instance.

For example, I have 3000 frames to render and 10 PCs. I would give 0…300 frame - to PC N1, 301…600 - to PC N2 etc…

Unfortunately, I can’t distribute rendering of one frame between PCs due I am using my own 360 stereo render…

What expected time of render 1 single frame on client?

My main question is, what’s the need for it? Is it a purely visual thing to ensure the view is the same on all PC clients, or is it because you want to increase the performance so you can do more particles or something? If it’s the latter, then don’t bother - you’ll take a huge hit rather than any gain and you’ll have a nightmare syncing frames, eventually framerate will be clamped by bandwidth, which is probably far lower than what you can do with GPU particles anyway.

If it’s purely to keep the view the same on all clients, then use Seeded Modules. You won’t have to synchronize anything over network because you simply ‘set’ the seed in the module itself and it never changes, so unless the client has a different version of the actual .uasset file, they’ll see the same thing. To fully synchronize each particle you need a Location, Rotation, Velocity, Rotational Velocity, Lifespan, Initial Size & Initial Colour, alongside any other uniform values. Most of those are FVector’s, which is 96-bytes.

So for a single sprite, that’s 20.16 Kbp/s at 30FPS - for ONE sprite. Most substantial systems usually have in excess of 50-100 sprites at any one time, which is around 2Mbp/s. Bandwidth Carnage.