ACTUALIZACIÓN: Esta pregunta se refiere a Farseer 2.x. El nuevo 3.x no parece hacer esto.
Estoy usando Farseer Physics Engine bastante ampliamente en este momento, y he notado que parece almacenar muchos tipos de valores temporales como miembros de la clase, y no en la pila como cabría esperar.
Aquí hay un ejemplo de la Body
clase:
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;
}
Parece que es una optimización de rendimiento manual. ¿Pero no veo cómo esto podría ayudar al rendimiento? (En todo caso, creo que dolería al hacer que los objetos sean mucho más grandes).
fuente
out
parámetro). Estoy bastante seguro de que el objetivo de esta regla es que el compilador puede omitir poner a cero esa memoria, ¿verdad? (¿Es realmente tan lento mover el puntero de la pila?)static
(y / o reutilizarlos más agresivamente). Tal como están las cosas, por ejemplo, laBody
clase en Farseer tiene unos 73 miembros flotantes de miembros "innecesarios".Buena pregunta. Soy un tipo bastante afilado de C # / .NET y un poco loco por el rendimiento, y esto me parece una decisión de diseño bastante extraña. Lo primero que me llama la atención es que este código no es seguro para subprocesos. No sé si eso es un problema en un sistema de Física, pero almacenar datos temporales fuera del alcance de un método suele ser una receta para el desastre.
Honestamente, si me encuentro con este tipo de código en un marco de terceros, probablemente trataría de encontrar otro marco.
fuente
El GC en el 360 básicamente solo realiza colecciones GEN 2, que son caras, por lo que las variables temporales que se crean y eliminan cada fotograma (como los objetos temporales) hacen que se ejecuten colecciones completas, lo que matará el rendimiento realmente rápido.
Sospecho que lo hicieron de esta manera para reutilizar ese objeto y no tenerlo recogido.
fuente