2012-03-29 36 views
6

C# kullanarak bir oyun programlama yapıyorum, bu yüzden performans konusunda çok endişeliyim.Sınıf VS ref Yapı

Ben ana farklar ne olduğunu bilmek ister ve mümkünse performans etrafında verileri aktarmak için bir Class ya kullanmanın düşünceler veya referans olarak geçirilen yapı olacaktır.

Ben performans nedenlerinden (ı ref tarafından geçen varsayıyorum burada değeriyle çok daha hızlıdır) için, etrafında verileri kopyalamak değil diliyorum.

Bir sınıfın her zaman referans olarak iletildiğini ve bir yapının değere göre aktarıldığını biliyorum, ancak yapıyı burada referans alarak iletmekten bahsediyorum.

ben geçmek isteyen verilerinin bir örneği: Önceki örnekte

public delegate void PathCompleteDelegate(List<PathFinderNode> path); 
public struct PathFinderJob{ 
    public PathCompleteDelegate callback; 
    public Vector3 start, end; 
    public PathSize unitSize; 
    public BoxCollider boxCollider; 
} 

, bir sınıf bir fark yaratmak kullanarak ki? Eğer öyleyse, fark ne olurdu? Bu örnekte bir sınıf bir yapıdan daha hızlı mı olur? Niye ya?

Teşekkür ederiz. Joao Carlos

+1

Her iki yaklaşımı da performans profili denediniz mi? Yapı, bir yöntemin kapsamı dışında belirtiliyorsa, yine de (öbekte bir sınıf içinde yer alan gibi) yığında olacaktır. Metot çağrıları açısından sınıfa veya yapısal yapıya aynı performansta olduğundan şüphelenirim. –

+0

Çok fazla deneyim profiline sahip değilim ve Unity3D'nin yerleşik profilerle hızlı bir profil denetimi yaptım, ancak bir fark görmedim, ancak, yerleşik profilerdeki bu tür "küçük balık" ile ne kadar iyi olduğunu bilmiyorum ya da diğer tüm oyunlarla ilgili profiller arasında bir fark görecekti. –

+0

OO dilinde bir oyun programlarken zaman yapılarımı boşa harcamam. Sorun ** Ben ** performans sorunları elde etmeden önce karşılaşacağız ** oyun biten **. Sınıflar ve nesneler, dev hız IMO'yu artırır. – Bitterblue

cevap

4

Temsilciniz bir başvuru türü alır - bir List, bu nedenle tüm listeyi yine de referans alarak geçirebilirsiniz.

Büyük bir yapıyı değere göre geçmek kesinlikle referansı geçmekten çok pahalıdır. Büyük bir yapınız olduğunda, genellikle onu bir yapı olarak kullanmak mantıklı değildir, sadece bir sınıfa dönüştürün.

Neyse, emin Burada bir performans sorununu olacak mı? Çok erken bir optimizasyon gibi görünüyor.

+0

Oyunu programlıyorum ve aynı zamanda daha hızlı kod yazmanın yolunu öğreniyorum. Bu tam adım bir problem değildir, çünkü en fazla saniyede 1000'den fazla pathfinding isteği olmayacaktır (varsayalım). Ancak, pathfinders düğüm yapısında bu, 100 nodu * 1000pathFindingRequests'e kadar çok iyi ölçeklenebilir ve muhtemelen bu konuda öğrenmeye yardımcı olabilir. –

+0

Dereferencing 100 düğüm 100 kere - yani, 100.000 dereerans, bir saniye herhangi bir sorun teşkil etmemelidir. – zmbq

+0

Ve eğer oyunun gecikme olduğu ortaya çıkıyorsa, profil oluşturma muhtemelen sorumlu olan tek bir kod satırı ortaya çıkaracaktır. Bilgisayarlar bu günlerde gerçekten çok hızlı. – fabspro

7

Bir sınıf her zaman referans olarak ve bir yapı değeri tarafından geçirilen olduğu geçirilir biliyorum, ama burada referans tarafından yapı geçirerek bahsediyor.

Muhtemelen doğru fikri var, ama bu yanlıştır. ref anahtar sözcüğünü kullanmadığınız sürece C# içindeki her şey değere göre geçirilir.

Sınıf örnekleri, başvuru türleridir, struct örnekleri, değer türleridir.

değeriyle bir referans türü geçirmek

, başvuruyla (küçük) bir kopyasını geçmektedir. Değer türünü değere göre geçirdiğinizde, tüm verilerin bir kopyasını (potansiyel olarak büyük) geçirirsiniz.

Jon Skeet tüm bu here iyi bir açıklaması var.

İlgili konular