Direct3D and Video-Memory uploading unpredictable costs


I have a problem that I’m not able to solve in a efficient way.


My graphics engine ( is something like a voxel engine ) manages load/unload of source data to display ( gigas of hd ). The process for each object is something like this:

LoadFromDisk -> UncompressDataAndGenerateMesh -> CreateDirect3DIndexAndVertexBuffersEtc

Each stage has its own cache, so, for example, if I need to reload something from the HD it may be in memory cached.
The ‘cube-unit-object’ that is managed by the engine is a ‘cube’ that is ‘openened’ in ‘8 children cubes’ if more detail is necessary when it is rendered.

As any dynamic level of detail engine, the distribution of the detail depends of the camera view ( and render target resolution in this case ), and as the camera moves the objects to be drawn changes.
When you revisit-redraw and object that was rendered some frames ago, it may take the cost of mem to videomem travel, or not if is already there. In lucky frames ( it dependes of your camera moves ) you reuse cached objects and in unlucky frames the amount of uploads to videomem freezes the screen.

Why can’t I get enough information from the api to calibrate my level of detail updates?

1.Allow a max-rate, for example, of 16 new objects to appear per frame ( opening only 2 ‘cube-unit-object’ per frame ). A rate that in the worst case means 16 objects to upload to video memory.
2.Allow to render any object that is ready to be drawn, taking the risk of the overhead of any possible amount of uploads to video memory.

Using solution 1 means that any effort to speedup the streaming pipeline is in vain. The bottle neck is the ignorance of how much traffic mem->vidmem I’m generating that forces me to assume the worst case. It works, but this ridiculous bottleneck downgrades the moments when great-cool-case is possible to the worst case.
Using solution 2 means to assume drops from 30 fps to 1 fps lots of times, wich converts my technology in something almost useless.

A way to know if the object that I will draw is already in the video memory. In that case I could control the amount of objects to could be uploaded+drawn and objects to be drawn directly.

Sorry for my ‘low-quality’ English and thanks in advance!

Results sample:

Levels of detail: