ОБНОВЛЕНИЕ: Этот вопрос относится к Farseer 2.x. Более новый 3.x, кажется, не делает этого.
В настоящее время я довольно широко использую Farseer Physics Engine, и я заметил, что он, похоже, хранит много временных типов значений в качестве членов класса, а не в стеке, как можно было бы ожидать.
Вот пример из Body
класса:
private Vector2 _worldPositionTemp = Vector2.Zero;
private Matrix _bodyMatrixTemp = Matrix.Identity;
private Matrix _rotationMatrixTemp = Matrix.Identity;
private Matrix _translationMatrixTemp = Matrix.Identity;
public void GetBodyMatrix(out Matrix bodyMatrix)
{
Matrix.CreateTranslation(position.X, position.Y, 0, out _translationMatrixTemp);
Matrix.CreateRotationZ(rotation, out _rotationMatrixTemp);
Matrix.Multiply(ref _rotationMatrixTemp, ref _translationMatrixTemp, out bodyMatrix);
}
public Vector2 GetWorldPosition(Vector2 localPosition)
{
GetBodyMatrix(out _bodyMatrixTemp);
Vector2.Transform(ref localPosition, ref _bodyMatrixTemp, out _worldPositionTemp);
return _worldPositionTemp;
}
Похоже, это оптимизация производительности вручную. Но я не понимаю, как это может помочь производительности? (Во всяком случае, я думаю, что было бы больно делать объекты намного больше).
out
параметра). Я вполне уверен, что весь смысл этого правила таков, что компилятор может пропустить обнуление этой памяти - верно? (Действительно ли так медленно перемещать указатель стека?)