Texture Streaming Problem 4.9

So we have been using 4.7.6 for quite some time, but recently we upgraded to 4.9. Everything seemed to have gone well, but the textures are constantly streaming at this point. Using stat streaming, it seems that all of the memory is above 100% being used to store textures. Did something change between 4.7 and 4.9 with the texture streaming? We haven’t changed anything texture-related, but it seems as though we are instantly running out of texture memory now. I was also wondering what everyone else is doing in order to maintain texture memory. Even if the actor is not used, the textures are all pre-loaded into the memory if they are referenced somewhere in the level, right?

Edit: My Pool Memory Used is 3908.60MB and my Non-Streaming Textures is 3895.80MB. I am 3313.36MB over budget. Like I said, I have changed nothing dealing with textures or settings going from 4.7.6 to 4.9.

What does r.Streaming.PoolSize gives?

Could you try and type “r.Streaming.PoolSize 2000” in the console in the Editor to perhaps force it to “reinitialise” the texture streaming? Just an idea.

Sorry for the delay. It doesn’t matter what I set my pool size too, it is always at the max memory of my GPU. I asked around in the substance forums too (because I had recently installed their plugin). They said there was a memory leak in 4.9 that is related to this and the issue is currently being looked into (I am assuming with the engine).

I am still wondering about how garbage collection works. If we reference or cast to an actor directly, the textures it has will be loaded into the memory at all times right? Even if the object is gone? But if we use interfaces or default object, when we remove the actor, the texture memory it is using will be eventually cleared right?

we had this issue with substance textures as all of their textures are set to non-streaming textures, they takes up too much space in the memory. We had to export the maps from the substance as a regular textures and reimport it inside unreal so it can streaming textures.
Check how much memory does single substance asset its taking.

Thanks,

You had this issue in 4.9 or in other engine versions? I was noticing the memory was seeming higher than normal with substance running, but I was under the impression that the RAM would be less due to the fact that substance materials take up less space than large texture maps? When you export the maps, are you still using the substance plugin?

we had this issue with both 4.8 n 4.9. I was under the same impression that substance textures take less space but we tested the scene with a single object in a scene using the material created by substance and using the export maps from substance and recreating material manually

Here is with using substance Asset:

Here is without using substance asset:

As you can see in the scene without substance asset, memory space is 20mb less.
No, we are not using substance plugins after exporting the maps. We just recreate the material.

Thanks,

Thanks for the help man. That is a major change in memory usage (nearly 30%). Are you using the same map size as you were in substance? I believe you can adjust the scale of the maps in the substance material right. Are they the same size as the map size that you exported from substance? It would make sense, though, since their textures must dynamically update for size and quality. I’ll try it out and see if I notice any difference in 4.9. Due to the memory leak issue that we have with the plugin, we instantly go over budget by 300-400%.

yes, we using the same resolution as in substance and if we need to change it, we change this property “LOD Bias” inside texture editor and it will increase or decrease image size based on image resolution.
Main problem with using substance asset is all the textures created by it are non-streaming so its taking full memory of textures.

Thanks,

Thanks so much for your help!

As far as the other question I have goes, I am still wondering if dynamically casting to an object loads that object and all its textures and stuff into the memory. If that’s the case, if a Character casts (or stores a permanent reference) to an object, even if the object is not in world, it would still be loaded into the memory. This would mean that if a character or controller dynamically casts to an object inworld, even if the object isn’t there, the textures and everything would be loaded and stored permanently into the memory (since there will always be a character or controller, right?). This would mean that dynamically casting or directly referencing an object is ridiculously inefficient in terms of memory as the number of objects cast to goes up, right?

I don’t know exact answer to this. Mostly it only loads textures of object which are in the scene. You can try and test it with a simple scene of your character and object you want to reference to it and check the memory usage with referencing an object and without referencing a object.

Thanks,

Here is a quick test i did:

Here is the scene with 2 seperate static mesh and with different textures :

Here is the scene with a Blueprint Actor that has a static mesh and it has reference to another static mesh :

It looks like it is only loading textures of the mesh that is in the scene and not the reference static mesh asset. You can try with your assets and see what the usage is.

Thanks,

That’s only pooled memory in the VRAM right? What did your memreport say? I wonder if it is loading the textures into the RAM?

Yea, from what I am noticing, textures are being loaded into the memory as soon as the referenced object is referenced. So, like I suspected, it seems like anything that is dynamically cast to an object will have those textures loaded (even if the object is not present inworld). This would present massive performance problems while casting.