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!