UPDATE: Pertanyaan ini mengacu pada Farseer 2.x. 3.x yang lebih baru tampaknya tidak melakukan ini.
Saya menggunakan Farseer Physics Engine cukup luas saat ini, dan saya perhatikan bahwa tampaknya menyimpan banyak tipe nilai sementara sebagai anggota kelas, dan tidak di tumpukan seperti yang diharapkan.
Ini adalah contoh dari Body
kelas:
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;
}
Sepertinya ini adalah optimasi kinerja dengan tangan. Tetapi saya tidak melihat bagaimana ini bisa membantu kinerja? (Jika ada yang saya pikir itu akan sakit dengan membuat benda lebih besar).
sumber
out
parameter). Saya cukup yakin seluruh poin dari aturan ini adalah agar kompiler dapat melewatkan zeroing memori itu - kan? (Apakah benar - benar lambat untuk memindahkan penunjuk tumpukan?)static
(dan / atau lebih agresif menggunakannya kembali). Seperti itu, misalnya,Body
kelas di Farseer memiliki sekitar 73 mengapung anggota yang "tidak perlu".Pertanyaan bagus. Saya seorang pria C # /. NET yang cukup tajam dan sedikit kacang kinerja, dan ini sepertinya keputusan desain yang agak aneh bagi saya. Hal pertama yang melompat pada saya adalah bahwa kode ini sama sekali tidak aman. Saya tidak tahu apakah itu masalah dalam sistem Fisika, tetapi menyimpan data sementara di luar ruang lingkup metode sering kali merupakan resep untuk bencana.
Jujur, jika saya secara teratur menemukan kode semacam ini dalam kerangka kerja pihak ketiga, saya mungkin akan mencoba menemukan kerangka kerja lain.
sumber
GC pada 360 pada dasarnya hanya melakukan koleksi GEN 2, yang mahal, sehingga variabel sementara yang dibuat dan dihapus setiap frame (seperti objek temp) menyebabkan seluruh koleksi berjalan, yang akan mematikan kinerja sangat cepat.
Saya curiga mereka melakukannya dengan cara ini untuk menggunakan kembali objek itu dan tidak mengumpulkannya.
sumber