MISE À JOUR: Cette question se réfère à Farseer 2.x. Le nouveau 3.x ne semble pas faire cela.
J'utilise Farseer Physics Engine pour le moment, et j'ai remarqué qu'il semble stocker beaucoup de types de valeurs temporaires en tant que membres de la classe, et non sur la pile comme on pourrait s'y attendre.
Voici un exemple de la Body
classe:
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;
}
Cela ressemble à une optimisation manuelle des performances. Mais je ne vois pas comment cela pourrait éventuellement améliorer les performances? (Si quoi que ce soit, je pense que cela ferait mal en rendant les objets beaucoup plus gros).
la source
out
paramètre). Je suis assez sûr que le but de cette règle est que le compilateur puisse ignorer la mise à zéro de la mémoire - non? (Est-ce vraiment si lent de déplacer le pointeur de pile?)static
(et / ou de les réutiliser de manière plus agressive). Dans l'état actuel des choses, juste par exemple, laBody
classe de Farseer compte quelque 73 chars de membres "inutiles".Bonne question. Je suis un gars C # /. NET assez pointu et un peu fou de la performance, et cela me semble une décision de conception plutôt étrange. La première chose qui me saute aux yeux est que ce code n'est en aucun cas sûr pour les threads. Je ne sais pas si c'est un problème dans un système de physique, mais le stockage de données temporaires en dehors du champ d'application d'une méthode est souvent une recette pour un désastre.
Honnêtement, si je rencontrais régulièrement ce type de code dans un framework tiers, j'essaierais probablement de trouver un autre framework.
la source
Le GC sur le 360 ne fait que des collections GEN 2, qui sont chères, donc les variables temporaires qui sont créées et supprimées à chaque image (comme les objets temporaires) entraînent l'exécution de toutes les collections, ce qui réduira les performances très rapidement.
Je soupçonne qu'ils l'ont fait de cette façon pour réutiliser cet objet et ne pas le récupérer.
la source