DirectX10 Texture Resource Memory Usage Explosion

Started by
5 comments, last by Yelmond 13 years, 9 months ago
Hello,

I need to cover a large area with several D3D10_USAGE_DYNAMIC type textures. The problem I encounter is after a certain amount of texture data being initialized my application's Private Working Set explodes from a stable 40MB to over 1GB. This issue has the following behavior:

1. The number of textures is irrelevant, all that matters is the amount of memory they require so many combinations of texture size and number of textures reproduce this problem.

2. It seems stable under a certain graphic memory load and does not grow at all while using the application, however, above 40MB or so of memory load, the usage explodes and continues to grow while using the application.

3. The most curious of all, assuming I have the application in the stable state, is if I now start a new graphic intensive application alongside mine (both being windowed), MY application's memory usage explodes, without me touching my application.

I can only guess that once graphic memory grows beyond a certain cacheable limit, virtual system memory goes insane but this only seems to affect my application. Is there anything I can do to alleviate this problem?

---

I am running Windows 7 64-bit and my app is 32-bit. I am using VC++ 2010 Express and it detects no memory leaks; memory usage explodes well after everything has been initialized. For the memory readings I used Process Explorer. I know its not the most accurate measure but I'm not really comfortable for such high usage numbers regardless of accuracy.

Thank you in advance for any help.
Advertisement
Dynamic resources will request additional memory every time you map them with a discard flag. This memory is freed when there are no more references in the command queues. Running a second graphics application can make your application GPU limited. As DirectX uses pre caching the command queues will grow in such situations. Without the second application the copy process could be the limiting factor. This way the runtime would never allocate additional memory.

Therefore the first question you should ask yourself is how much data you update per frame. Because of the pre caching you should calculate with a factor 4 to 5 to be safe.

Thanks for the quick reply. I only map each texture on creation and I create and initialize one texture each frame until all have been completed, after which, I do not map anything for the rest of the app's runtime. I will try creating one each 10 frames and report back but for now my question remains as to why my memory usage grows when I start another application well after all my initializations and mappings have been done and my app has been running for some time with a low stable memory usage.

Also, if I close the second application my memory usage never decreases.

As additional information, I create one resource for each of my textures at the same time I create the textures. I then store pointers for each in arrays. As the user moves the camera along the surface I load only 10 (out of 205) textures into the Effects file by choosing the appropriate resource pointers from the array. I mention this because memory usage (once in the unstable state) grows as I move the camera over the surface.

Thanks again.
If the textures are never changed after the first time you should not use dynamic resources. In this case use default or even better immutable resources.
Sorry for the mixup. I do plan to draw on them during runtime; I just did not implement that part of the code yet so at this point I am not mapping them after initialization. I would like to figure this problem out first before I continue.

My goal here is simply to have a large 3D surface that the user can draw on (with the mouse). It's way to large for a single texture to give me the quality I need so I need to do this dance with several dynamic textures. It's the best method I can come up with at the moment.
How large are your textures?
Have you already checked that there are no reference leaks?
My textures are 400 by 400 each at the moment with only 1 MipLevel. They have DXGI_FORMAT_R32G32B32A32_FLOAT format. If I make them any larger the program will go into the unstable state without any other graphic app running.

Regarding my references I create a fixed number (205) references in total and do not create more after that. I release on program exit along with the textures and this process has been tested and does indeed free all 205 references and textures.

This topic is closed to new replies.

Advertisement