Jump to content

  • Log In with Google      Sign In   
  • Create Account

Interested in a FREE copy of HTML5 game maker Construct 2?

We'll be giving away three Personal Edition licences in next Tuesday's GDNet Direct email newsletter!

Sign up from the right-hand sidebar on our homepage and read Tuesday's newsletter for details!


We're also offering banner ads on our site from just $5! 1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


Resource method Release() won't release memory


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
3 replies to this topic

#1 Void12   Members   -  Reputation: 208

Like
0Likes
Like

Posted 23 March 2014 - 11:22 PM

So, in tree(which process frustum culling), I call

  

void CRTreeStatic::ManageModelsResources(CCamera const *const &_pCamera) const
{
...
// some tree traversing and choosing pLOD

 if (MemStatus.dwMemoryLoad > 80)
 {
  CModelResource::GetInstance()->UnloadModel((IModel *const)pLOD->GetModel());
 }
}

After that, model will pushed to m_Unloading inside resource manager.
 
This is worker thread of resource manager:

 

void CModelResourceWorkedThread::WorkerThread()
{
while (1)
{
for (auto iModel : m_Unloading)
{
if (!iModel->IsOnLoading() && iModel->IsLoaded())
{
iModel->ClearGeometry();
}
}
m_Unloading.clear();
}
}

 After that, inside ClearGeometry():

void ClearGeometry()
{
Lock(); // mutex lock


m_bOnLoading = true;


for (auto iMesh : m_Meshes)
{
iMesh->ClearGeometry();
}


m_bIsLoaded = false; // atomic
m_bOnLoading = false; // atomic


Unlock();
};

Inside Mesh::ClearGeometry():

void ClearGeometry()
{
//SAFE_RELEASE(m_pVertexBuffer);

while (m_pVertexBuffer->Release())
{
}

m_pVertexBuffer = nullptr;

m_nVertices = 0;

for (auto iSplit : m_MaterialSplits)
{
iSplit->ClearGeometry();
}
};

 
Last command executs 100%. I have debugged it.
 
Buffer creation inside loader.cpp:

 D3D11_BUFFER_DESC bd;
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = sizeof(CVertex)* pMesh->m_nVertices;
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
bd.CPUAccessFlags = 0;


D3D11_SUBRESOURCE_DATA InitData;
ZeroMemory(&InitData, sizeof(InitData));
InitData.pSysMem = pVertices;


if (pMesh->m_pVertexBuffer)
{
    printf("debugger doesn't stop here\n");
}


V_RETURN(pD3DDevice->CreateBuffer(&bd, &InitData, &pMesh->m_pVertexBuffer));

 
Why I release buffer in realtime?
 
Count of objects in scene is very big, and I have to unload and download part of them in realtime(because of RAM and GPU memory not rubber).
 
And memory doesn't deallocates! Used GPU memory and RAM only grows!
 
What happens? Why memory doesn't deallocates? So strange problem...
Help!


Edited by Void12, 24 March 2014 - 01:14 AM.


Sponsor:

#2 Krohm   Crossbones+   -  Reputation: 3167

Like
0Likes
Like

Posted 24 March 2014 - 12:20 AM

I'm afraid we have a serious communication problem.

So I assume you have a list of render-able objects and you null them as a result of frustum culling.

Ok, fine, what about the various draw-buffers... you create one each visible object? Every frame? Yikes.

You cannot just say "I have this macro", I call it "somewhere" and conclude "it doesn't work". You claim to "release buffer in realtime" but we don't see any release call being issued in the code you provided, if not in complete isolation in line 2.



#3 Void12   Members   -  Reputation: 208

Like
0Likes
Like

Posted 24 March 2014 - 01:06 AM

I'm afraid we have a serious communication problem.

So I assume you have a list of render-able objects and you null them as a result of frustum culling.

Ok, fine, what about the various draw-buffers... you create one each visible object? Every frame? Yikes.

You cannot just say "I have this macro", I call it "somewhere" and conclude "it doesn't work". You claim to "release buffer in realtime" but we don't see any release call being issued in the code you provided, if not in complete isolation in line 2.

Code is too large. Up there is cutted code.

 

Just, I want to know, where is potential error?

 

UPD:

Ok, I edit the first post. Understandable?


Edited by Void12, 24 March 2014 - 01:15 AM.


#4 incertia   Crossbones+   -  Reputation: 779

Like
0Likes
Like

Posted 28 March 2014 - 09:05 PM

Things would make a lot more sense if you also posted how you chain these calls together in your actual program.
what




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS