Farseer 2.x neden geçici işlemleri yığında değil üye olarak depolar? (.AĞ)


10

GÜNCELLEME: Bu soru Farseer 2.x. Daha yeni 3.x bunu yapmıyor gibi görünüyor.

Farseer Physics Engine'i şu anda oldukça kapsamlı bir şekilde kullanıyorum ve bir çok geçici değer türünü sınıfın üyeleri olarak sakladığını fark ettim ve beklendiği gibi yığınta değil.

İşte Bodysınıftan bir örnek :

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;
}

Bir elle performans optimizasyonu gibi görünüyor. Ama bunun performansa nasıl yardımcı olabileceğini anlamıyorum? (Sanırım bir şey nesneleri daha büyük yaparak zarar verir).

Yanıtlar:


6

.NET'te değer türleri yığın üzerinde depolanmasına rağmen, en düşük ayırma maliyeti sağlar, ancak başlatma maliyetini ortadan kaldırmaz.

Bu durumda, çağrı başına 16-32 float başlatılmasına neden olacak bir veya iki geçici matris kullanan bir dizi fonksiyonumuz var. Bu önemsiz gibi görünse de, yöntemler yeterince sık kullanılırsa (örneğin, çerçeve başına binlerce ve binlerce kez), toplam ek yükün anlamlı bir etkisi olabilir. Böyle bir teknik tüm bu yöntemlerde sistematik olarak kullanılırsa, ortadan kaldırılan ek yük önemli ölçüde olabilir.

Böyle bir tekniğin kullanılması, nesne başına seviyede iplik güvenliği sağlama yeteneğini ortadan kaldırırken, bu garantiyi böyle bir zerre düzeyinde sağlamak genellikle akılsızdır.


Bundan emin misin? Sahip olduğum bir düşünce, kurucuları çağırmaktan kaçınmak olabilirdi. Ancak değer türlerinde, tüm üyeleri ayarlayacaksanız (veya outparametre olarak geçirecekseniz ) , varsayılan parametresiz yapıcı da dahil olmak üzere bir kurucu çağırmanız gerekmez . Bu kuralın tüm noktası derleyici bu bellek sıfırlama atlayabilirsiniz eminim - değil mi? ( Yığın işaretçisini hareket ettirmek gerçekten bu kadar yavaş mı?)
Andrew Russell

Şaşırtıcı değil mi? Ne yazık ki, oluşturulan IL'yi incelerseniz, geçici matrisler başlatılır. Birkaç hızlı test, üye temp sürümünün ~% 10-15 daha hızlı olduğunu gösterir.
Jason Kozak

1
Hayrete düştüm . "XNA Framework Performansını Anlamak" da (GDC2008) Shawn Hargreaves şu yapıları söylüyor: "[JIT] genellikle şunu anlayacaktır: 'sonraki satırda [Vector3]' ün üç alanını da hemen ayarlıyor, bu yüzden ihtiyacım bile yok sıfırlamak için '' . Bilgilerim nereden geliyor. Ama şimdi tekrar dinlerken sadece "genellikle" diyor. Sunumdaki bir sonraki nokta, JIT'in ekli hata ayıklayıcı ile farklı davranarak performansı etkilemesidir (nasıl test ettiniz?). Ayrıca: burada JIT hakkında konuşuyor, belki de IL "iyi" kalır (doğrulanabilirlik?).
Andrew Russell

IL, Reflektör aracılığıyla denetlendi ve testler, Sürümde yerleşik olan IDE'nin dışında gerçekleştirildi (Windows'ta artık test edeceğim bir CC üyeliğim yok)
Jason Kozak

1
Buna dayanarak - bu üye geçici işlemleri yapmanın daha iyi (ve ne kadar iyi olacağını) merak ediyorum static(ve / veya onları daha agresif bir şekilde tekrar). Olduğu gibi, örneğin, BodyFarseer'deki sınıfın 73 adet "gereksiz" üyeye sahip.
Andrew Russell

-1

İyi soru. Ben oldukça keskin bir C # /. NET adam ve biraz performans somunu ve bu benim için oldukça garip bir tasarım kararı gibi görünüyor. Bana atlar ilk şey bu kod hiçbir şekilde iş parçacığı güvenli olmasıdır. Bunun bir Fizik sisteminde bir sorun olup olmadığını bilmiyorum, ancak geçici verileri bir yöntemin kapsamı dışında saklamak genellikle bir felaket tarifi.

Dürüst olmak gerekirse, bu tür bir kodla üçüncü taraf bir çerçevede düzenli olarak karşılaşırsam, muhtemelen başka bir çerçeve bulmaya çalışırdım.


3
Bu soruya gerçekten cevap vermiyor.
Brian Ortiz

Evet, yapabileceğim en iyi şey deli olmadığını doğrulamak ve bu şekilde kodlanmasının gerçek bir yararı yok gibi görünüyor. Gerçek amacı sadece kodu yazan adama sormaktır :).
Mike Strobel

Teşekkürler, Mike. Orijinal geliştiricinin ben değil çılgın olduğundan şüphelenmeye başlıyorum. Ama her zaman kontrol etmeye yardımcı olur;)
Andrew Russell

İş parçacığı güvenliği bazen, özellikle SIMD talimatlarını kullanmayan bir platform için bir FP hesaplama ağır kitaplığı yazarken sağlamak için maliyetli bir garanti olabilir.
Jason Kozak

-1

360'taki GC temelde sadece pahalı olan GEN 2 koleksiyonlarını yapar, bu nedenle her kareyi (geçici nesneler gibi) oluşturup kaldıran geçici değişkenler, tüm koleksiyonların çalışmasına neden olur ve bu da performansı çok hızlı bir şekilde öldürür.

Bu nesneyi yeniden kullanmak ve toplatılmamasını sağladıklarından şüpheleniyorum.


1
Bu da benim başıma geldi, ancak geçici üyeler değer türleri gibi görünüyor, bu yüzden yine de yönetilen yığın üzerinde tahsis edilmeyeceklerdi.
Mike Strobel

2
Doğru, ama sadece sınıf üyesi iseler. Yerli iseler (yöntem-kapsam), yığın üzerine tahsis edilirler. Soru şu ki, neden bu rotaya gitmediler.
Mike Strobel

1
@Blair - MSDN'ye ( msdn.microsoft.com/en-us/library/bb203912.aspx ) göre Xbox360 .NET Compact Framework'ü kullanmaktadır. Görünüşe göre GC'deki fark bununla ilgili, bu yüzden konuyla ilgili daha fazla araştırma için bunu takip ediyorum.
Logan Kincaid

1
@Blair: @Logan Kincaid doğrudur. CF'nin Çöp Toplayıcısı normal çerçevelerden farklı davranır. XNA Game Studio 3.0 Unleashed'de konu hakkında iyi bir konuşma var - ancak bu kitap yakında 4.0'ın piyasaya sürülmesiyle eski olacak.
Steven Evers

1
@Blair: 360'ın (ve CF üzerinden hedeflenen çoğu cihazın) sınırlı bellek ortamı nedeniyle bir Mark & ​​Sweep GC kullanılır. Sonuç olarak, çok sayıda küçük ayırma bir koleksiyonu tetikler ve toplama süresi referans # sayısına göredir. Ayrıntılar burada: download.microsoft.com/.../Mobility/…
Jason Kozak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.