AKTUALIZACJA: To pytanie dotyczy Farseer 2.x. Nowsza wersja 3.x tego nie robi.
W tej chwili używam Farseer Physics Engine dość szeroko i zauważyłem, że wydaje się, że przechowuje wiele tymczasowych typów wartości jako członków klasy, a nie na stosie, jak można się spodziewać.
Oto przykład z Body
klasy:
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;
}
Wygląda na ręczną optymalizację wydajności. Ale nie rozumiem, w jaki sposób mogłoby to poprawić wydajność? (Jeśli cokolwiek, myślę, że zaszkodziłoby, gdyby obiekty były znacznie większe).
out
parametr). Jestem całkiem pewien, że cały sens tej reguły jest taki, aby kompilator mógł pominąć zerowanie tej pamięci - prawda? (Czy to naprawdę tak wolno przesuwać wskaźnik stosu?)