网格优化

Mesh Optimization

生成网格的class。顶点数越高掉帧越快,应该怎么优化?我已经使用了 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 用于渲染网格的时间就越多。 您不能无限优化网格以获得您想要的性能。

您可以尝试用更现代的东西替换当前的网格优化库。 有来自 Microsoft 的 DirectXMesh 库:https://github.com/microsoft/DirectXMesh

您可以使用 OptimizeFaces,然后使用该库中的 OptimizeVertices,并测试它是否会产生更好的性能。

但是您不应该期望仅仅通过优化网格就能获得更好的性能。 你应该看看你的渲染代码是否也可以优化。