Hi All, this is my first post so please forgive me if this is the wrong section or misdirected!
Now to get down to business. I have been working on a 3d visualization for a simulation in XNA. The graphics are all implemented and I have
been trying to improve performance. I have isolated that the main performance hog is all the matrix operations done on animated models. (The project is currently CPU Bound)
Specifically this code
//Compute all of the bone absolute transforms
for (int i = 0, index = 0; i < model.Bones.Count; i++, index++)
{
model.Bones[i].ComputeAbsoluteTransform();
model.boneTransforms[index] = model.Bones[i].AbsoluteTransform;
}
//Determine the skin transforms from the skeleton
for (int s = 0; s < model.ModelExtra.Skeleton.Count; s++)
{
model.skeleton[s] = model.Bones[model.ModelExtra.Skeleton[s]].SkinTransform
* model.Bones[model.ModelExtra.Skeleton[s]].AbsoluteTransform;
}
Even more specifically the compute absolute transform is particularly CPU intensive.
private Matrix _scaleMatrixTemp;
private Matrix _rotationMatrixTemp;
private Matrix _translationMatrixTemp;
private Matrix _transformMatrix;
private Matrix _tempA;
private Matrix _tempB;
/// <summary>
/// Compute the absolute transformation for this bone.
/// </summary>
public void ComputeAbsoluteTransform()
{
Matrix.CreateScale(ref bindScale, out _scaleMatrixTemp);
Matrix.CreateFromQuaternion(ref rotation, out _rotationMatrixTemp);
Matrix.CreateTranslation(ref translation, out _translationMatrixTemp);
Matrix.Multiply(ref _scaleMatrixTemp, ref _rotationMatrixTemp, out _tempA);
Matrix.Multiply(ref _tempA, ref _translationMatrixTemp, out _tempB);
Matrix.Multiply(ref _tempB, ref bindTransform, out _transformMatrix);
if (Parent != null)
{
// This bone has a parent bone
Matrix.Multiply(ref _transformMatrix, ref Parent.AbsoluteTransform,
out AbsoluteTransform);
}
else
{
// The root bone
AbsoluteTransform = _transformMatrix;
}
}
I have read about the benefits of using the ref version of Matrix multiply. But is there something I am missing, this still seems to be the most CPU intensive part of the whole application. Is there something I am missing that can be moved to the GPU? Or is this just the price one has to pay for skinned animations?
Thanks!