2015-09-06 58 views
0

我一直在打擊我的軟件中的內存泄漏,其中我的應用程序的虛擬地址空間被共享內存慢慢耗盡。根據泄漏的內存量,它以紋理對象的形式非常清晰。DirectX 9到11 OpenSharedResource像瘋了一樣泄漏內存。難道我做錯了什麼?

我已經將錯誤隔離到以下代碼示例。我創建了一個可共享的DX9紋理對象,我從D3D11設備打開它,然後釋放它。在本示例中,在Windows 8.1上運行我的NVIDIA GeForce 780 Ti,我的32位進程非常快速地耗盡了VAS,因爲這些紋理似乎沒有被釋放。

我是否誤解了API,DirectX中是否存在缺陷,或者我的GPU驅動程序中是否存在缺陷?任何有關解決此問題的建議或聯繫人都非常感激。

while (true) 
{ 
    IDirect3DTexture9* tex = nullptr; 
    HANDLE handle = 0; 
    hr = device9->CreateTexture(1024, 1024, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &tex, &handle); 
    VERIFY_SUCCEEDED(hr); 

    ID3D11Texture2D* tex11; 
    hr = device11->OpenSharedResource(handle, __uuidof(ID3D11Texture2D), (void**)&tex11); 
    VERIFY_SUCCEEDED(hr); 

    tex11->Release(); 
    tex->Release(); 

    Sleep(10); 
} 

如果我註釋掉「OpenSharedResource」部分沒有泄漏。 DirectX 9紋理被重複創建和釋放,沒有問題。在DirectX11的

while (true) 
{ 
    IDirect3DTexture9* tex = nullptr; 
    HANDLE handle = 0; 
    hr = device9->CreateTexture(1024, 1024, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, &tex, &handle); 
    VERIFY_SUCCEEDED(hr); 

    //ID3D11Texture2D* tex11; 
    //hr = device11->OpenSharedResource(handle, __uuidof(ID3D11Texture2D), (void**)&tex11); 
    //VERIFY_SUCCEEDED(hr); 

    //tex11->Release(); 
    tex->Release(); 

    Sleep(10); 
} 

回答

0

資源釋放不是即時的,當引用計數爲0,而且一旦命令已經完成執行它發生。

因此,通常您的資源將保持活動狀態,直到您調用Present或在直接的Device上下文中強制刷新。

如果添加:

immediatecontext11->Flush(); 

你的睡眠呼叫之前,您DirectX11的資源會得到妥善銷燬。