在DEBUG模式下,使用CPU計算的骨骼動畫總是很慢,當遊戲中角色數目多的時候只有幾幀,嚴重影響工作效率。今天測試了一下,774個頂點的模型在DEBUG下混合需要10ms,RELEASE下只需要0.3ms,DEBUG比RELEASE慢了30倍。
部分代碼如下:
for( int i = 0; i < iNumBaseVertex; ++i )
{
v3dBlendInfo &bi = m_BlendInfoVec[i];
const v3dxVector3 position = m_UsingBasePosVec[i];
const v3dxVector3 normal = m_UsingBaseNormalVec[i];
for( int j = 0; j < bi.iEffectBoneCount; ++j )
{
// 頂點混合
}
}
做了如下修改後,DEBUG下只需1ms,RELEASE沒變化,還是0.3ms:
v3dBlendInfo *pBlendInfoVec = &m_BlendInfoVec[0];
v3dVector3 *pUsingBasePosVec = &m_ UsingBasePosVec[0];
v3dVector3 *pUsingBaseNormalVec = &m_ UsingBaseNormalVec[0];
for( int i = 0; i < iNumBaseVertex; ++i )
{
v3dBlendInfo &bi = pBlendInfoVec[i];
const v3dxVector3 position = pUsingBasePosVec[i];
const v3dxVector3 normal = pUsingBaseNormalVec[i];
for( int j = 0; j < bi.iEffectBoneCount; ++j )
{
// 頂點混合
}
}
總結:DEBUG下STL容器的運算子(如[])都是函數調用,如果在多次迴圈內部做這些操作會嚴重影響效率。以後遇到這種情況可以先用STL將演算法調正確,然後替換成快速的數組操作方便調試。RELEASE下STL許多函數都被INLINE,所以兩種做法效率差不多。
誰有更好的辦法, 一定要共用一下,嘿