簡體   English   中英

網格優化

[英]Mesh Optimization

生成網格的類。 頂點數越多,幀下降越快,我應該如何優化它? 我已經使用了 OptimizeInplace 函數,但我只能期待 10 幀的改進。

void Sprite::initialize()
{
    LPD3DXBUFFER pD3DXMtrlBuffer;

    D3DXLoadMeshFromX(fileName.c_str(), D3DXMESH_SYSTEMMEM, Render->g_pDevice, NULL,
        &pD3DXMtrlBuffer, NULL, &m_dwNumMaterials, &m_pMesh);

    D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
    m_pMeshMaterials = new D3DMATERIAL9[m_dwNumMaterials];
    m_pMeshTextures = new LPDIRECT3DTEXTURE9[m_dwNumMaterials];

    for (DWORD i = 0; i < m_dwNumMaterials; i++)
    {
        m_pMeshMaterials[i] = d3dxMaterials[i].MatD3D;

        m_pMeshMaterials[i].Ambient = m_pMeshMaterials[i].Diffuse;
        
        m_pMeshTextures[i] = NULL;
        if (d3dxMaterials[i].pTextureFilename != NULL)
        {
            D3DXCreateTextureFromFileA(Render->g_pDevice, d3dxMaterials[i].pTextureFilename, &m_pMeshTextures[i]);
        }
    }
    pD3DXMtrlBuffer->Release();


    std::vector<DWORD> adjacencyBuffer(m_pMesh->GetNumFaces() * 3);
    m_pMesh->GenerateAdjacency(0.0f, &adjacencyBuffer[0]);
    m_pMesh->OptimizeInplace(
        D3DXMESHOPT_ATTRSORT |
        D3DXMESHOPT_COMPACT |
        D3DXMESHOPT_VERTEXCACHE,
        &adjacencyBuffer[0],
        0, 0, 0);
}
void Sprite::render()
{
    Render->g_pDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);

    for (DWORD i = 0; i < m_dwNumMaterials; i++)
    {
        Render->g_pDevice->SetMaterial(&m_pMeshMaterials[i]);
        Render->g_pDevice->SetTexture(0, m_pMeshTextures[i]);

        m_pMesh->DrawSubset(i);
    }
}

您擁有的頂點越多,GPU 需要花在渲染網格上的時間就越多。 您不能只是無限優化網格以獲得所需的性能。

您可以嘗試用更現代的東西替換當前的網格優化庫。 有來自微軟的 DirectXMesh 庫: https : //github.com/microsoft/DirectXMesh

您可以使用 OptimizeFaces 后跟來自該庫的 OptimizeVertices 並測試它是否會帶來更好的性能。

但是您不應該僅僅通過優化網格來獲得更好的性能。 您應該查看您的渲染代碼是否也可以優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM