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).
źródło
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?)static
(i / lub bardziej agresywnie ponownie ich używać). Na przykładBody
klasa Farseer ma około 73 pływaków o wartości „niepotrzebnych” członków.Dobre pytanie. Jestem dość ostrym facetem C # / .NET i trochę wariatem wydajności, co wydaje mi się dość dziwną decyzją projektową. Pierwszą rzeczą, która mnie zaskakuje, jest to, że ten kod nie jest w żaden sposób bezpieczny dla wątków. Nie wiem, czy jest to problem w systemie fizyki, ale przechowywanie danych tymczasowych poza zakresem metody jest często receptą na katastrofę.
Szczerze mówiąc, gdybym regularnie spotykał się z tego rodzaju kodem w frameworku innej firmy, prawdopodobnie spróbowałbym znaleźć inny framework.
źródło
GC na 360 w zasadzie robi tylko kolekcje GEN 2, które są drogie, więc zmienne tymczasowe, które są tworzone i usuwane z każdej ramki (jak obiekty tymczasowe) powodują, że działają całe kolekcje, co bardzo szybko zabija wydajność.
Podejrzewam, że zrobili to w ten sposób, aby ponownie użyć tego obiektu i nie odebrać go.
źródło