网格优化
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,并测试它是否会产生更好的性能。
但是您不应该期望仅仅通过优化网格就能获得更好的性能。
你应该看看你的渲染代码是否也可以优化。
生成网格的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,并测试它是否会产生更好的性能。
但是您不应该期望仅仅通过优化网格就能获得更好的性能。 你应该看看你的渲染代码是否也可以优化。