[Gear VR] particles are not being culled ?

I added a few candles from one of the Marketplace assets into my scene, completely enclosed inside a building. I used FREEZERENDERING cmd to make sure stuff gets culled (in the Editor and on the device) and stuff does get culled - I didn’t see anything inside the building, not particles, not geometry.

However, fps was horrible on the device as if those particles were rendered in front of the camera. They are expensive (I ran shader complexity and it was red on the particles), don’t get me wrong, but I expected for them to be culled and only drop performance down when I entered the building.

Is it a bug?


P.S. Those are GPU particles and I am using UE 4.14.1

Dynamic occlusion is not handled on mobile platforms. You get distance and view frustum culling based on the bounds of the mesh. I can easily see this happening on my S7 Edge. So this means that if you have your camera/view lined up and a wall in front of it. Anything behind it is still being rendered UNLESS you use Precomputed Visibility Volumes, Cull Distance Volumes, or Min/Max Draw Distance (selected Actor’s level details panel) to remove it from view.

This is not exclusive to particles and affects any actors in the scene.

Yes, I used Precomputed Visibility Volumes, that’s why when I freeze rendering I can clearly see that everything is culled, including particles, inside that “building”. However, fps is like ~20. If I delete particles and change nothing else, fps is 60. I am not sure why fps drop is so sever when particles are culled.

I should have specified, I just mention them typically because they are good for mobile, but Precomputed visibility volumes and Cull Distance Volumes won’t specifically remove particle systems since they only work for static actors, which Particle Systems are considered dynamic.

Use Max Draw Distance instead when culling these. You can use Stat Initviews to see the number of dynamic primitives increase and decrease when these are within/not within range.

If you’re unsure about checking this use a blank level with a single static mesh and one or two particle systems. Set the Max Draw Distance to a reasonable value (I used 500 for my test), and then as you pull back or get close you can monitor Stat Initviews and see the value increase and decrease as they are no longer rendered. Performance comes back as well for any FPS hit you receive, within reason! I preface that part because if you’re using precomputed visibility for the scene as well this uses it’s own memory for storing the locations of static actors so it has it’s own performance cost dependent upon the size of your level. Precomputed visibility is ideal for small to medium sized levels.

Also make sure you go into your Particle system and in the toolbar click the drop-down next to Bounds and use “Set Fixed Bounds”.