XNA ve C # vs 360's sipariş işlemcisi


14

Bu rant okuduktan sonra , muhtemelen doğru olduklarını hissediyorum (Xenon ve CELL BE hem dallı ve önbellek cahil koduna son derece duyarlıdır ), ama insanların da C # ile iyi oyunlar yaptığını duydum.

Peki, XNA ile profesyonel bir şey yapmanın imkansız olduğu doğru mu , yoksa poster sadece XNA'yı oyun geliştirme için katil API yapan şey eksik mi?

Profesyonel olarak, ondan para kazanabileceğiniz anlamına gelmiyorum, ama daha profesyonel oyunların, içsellere bu kadar kesin engelleri olan bir dilin ulaşamayacağı görünen fizik modelleri ve animasyon sistemleri olduğu anlamına gelmez. . Eğer oyunum için bir çarpışma sistemi veya akışkanlar dinamiği motoru yazmak istersem, C # bana çalışma zamanı kodu üreteci ve içsel eksikliği performansın önüne geçtiği için bunu yapma şansı sunuyor gibi hissetmiyorum.

Bununla birlikte, birçok insan bu kısıtlamalar dahilinde iyi çalışıyor, başarılı oyunlarını yapıyor ama görünüşte herhangi bir problemden kaçınarak kaçınıyor. Herhangi bir XNA oyununun, kütüphaneler tarafından sağlananlardan veya gölgelendiriciler tarafından ele alınandan başka karmaşık bir şey yaptığını fark etmedim. Bu daha karmaşık oyun dinamikleri kaçınılması nedeniyle C # sınırlamaları veya sadece bunu yapmaya konsantre insanlar ?

Dürüst olmak gerekirse, AI savaşının bazı veri odaklı yaklaşımlar veya bazı kirli C # saldırıları olmadan standart yaklaşımdan daha iyi çalışmasını sağlamak için AI'nın birçok birimini koruyabildiğine inanamıyorum ve sanırım bu da kısmen sorum, nasıl insanlar bu kodlayıcıların C ++ ile doğal olarak ne yaptığını yapabilmek için C # hackledi?


Gerçekten de Rant. Adam hakkında HERHANGİ bir bilgi bulamıyor ve bir girişim olduklarını görüyoruz, bunu desteklemek için her türlü elle tutulur bilgiyi görmek istiyorum ...
Jonathan Connell

Nedeniyle stüdyoları tam olarak anlamıyorum XNA kullanmaya itiraf gibi görünmüyor. Ancak burada birçok örnek bağlantı var
Tristan Warner-Smith

Peki, onu yedeklemek için açık bilgi CPU'nun C # olan dallı kodda oldukça doğal olarak kötü olmasıdır. Bilmek istediğim, profesyonel XNA kullanıcıları ne yapıyorlar, C # tarafından uygulanan yumuşak limite çarpmadıkları anlamına mı geliyor?
Richard Fabian

3
aşağı oy anlayamıyorum ...
FxIII

3
Sanırım bir çok insan bağlantılı makalesindeki (sayısız) teknik hatadan dolayı Richard'ın sorusunu küçümsüyor ve bazıları "profesyonel" kelimesini "para kazanıyor" yerine "Halo düzeyinde üretim" anlamına geliyor. İkincisi kötü bir seçimdir, ancak sadece bağlantıya katılmamanız nedeniyle aşağı inmeyin - bunun yerine cevap vererek onu çıkarın.

Yanıtlar:


21

Tamam, sadece bağlantı kurduğunuz rantta bazı delikler açmak için:

  • "C #" Tam Zamanında "bir yorumlayıcıya dayanır - yanlış - bir JIT derleyicisidir . Bir yöntem bir kez JITted yapıldıktan sonra , derlenen kod her çağrı için yeniden kullanılır. Derlenmiş kod yerel, önceden derlenmiş koda çok yakındır.
  • "Xenon CPU bir" yerinde "işlemci" - "sırayla" mı demek? - Ve: "Xenon CPU'nun dal tahmini yok" . Bu, JIT derlemesinin doğal olarak CPU tarafından yeniden sipariş edilmesi gereken ve çok fazla dallanmaya neden olan kötü kod ürettiği anlamına gelir - ki bu tamamen saçmalıktır . Bu CPU mimarisinde çalıştırmak için aynı performans önerisi hem C ++ hem de C # için geçerlidir.
  • "[JIT] 360 üzerinde sürekli yıkama gerektirir" - yanlış, derlenmiş kod normal derlenmiş kodlar gibi önbellekte tutulabilir. (Boru hattını yıkamak anlamına geliyorsa, yukarıdaki noktaya bakın.)
  • "jenerik [...] kod üretmeyi kullan" - jenerikler diğer her şey gibi JIT'tir ve diğer her şey gibi JITted kodu da hızlıdır. Jenerik kullanımı için performans cezası yoktur.
  • "dilin tüm seksi bitleri [...] her iki dal tahminini gerektirir ..." - bu C ++ için de geçerli değil mi? - "... veya [...] yerinde kod oluşturma" - JITting mi demek? Hızlı olduğunu söylemiş miydim? ( Masaüstü CLR'nin gerçek kod oluşturmayı kullandığı tüm yerlere girmeyeceğim - Xbox 360 tarafından desteklenmeyen bir özellik!)
  • "[C #] [C ++] 'ın muazzam kütüphanelerine sahip değil" - diyelim ki XNA? Ve daha fazlası . (Yine de, bu biraz adil bir nokta.)

Xbox 360 üzerindeki XNA, .NET Compact Framework CLR'nin değiştirilmiş bir sürümünde çalışır. Masaüstü sürümünün standartlarına uygun olmadığından şüphem yok. JITter muhtemelen iyi değil - ama bunun da kötü olduğunu düşünmüyorum . Masaüstü CLR ile karşılaştırıldığında korkunç olan çöp toplayıcısından bahsetmediğine şaşırdım .

(Tabii ki, profesyonel olarak geliştirilmiş bir oyunda çöp toplayıcıya vurmamalısınız , tıpkı herhangi bir profesyonel dereceli oyunda tahsislere dikkat etmelisiniz .)

(.NET Compact Framework'ün gerçek teknik tartışması için belki de şu makale serisiyle başlayın: Genel Bakış , JIT Derleyici ve GC ve yığın .)

Terminolojisi hakkında tamamen belirsiz olduğu, ne demek istediğini anlamayı bile zorlaştırıyor. Ya maksimum rant modunda ya da ne hakkında konuştuğunu bilmiyor.


Şimdi yolumdan o olduğuna göre burada bazı şeyleri vardır do 360 XNA kullanarak yerine yerli giderek kaçırmak :

  • Gerçekten çok hızlı CPU kayan nokta matematiği yapmak için SIMD / Vektör birimine erişim
  • Muhtemelen C # 'dan biraz daha hızlı olacak yerel dil kodunu kullanabilme
  • Yetenek bir olmak biraz bellek tahsis nasıl bit lazier
  • XBLIG oyunları 6 çekirdekten sadece 4'üne erişebilir (ancak yine de 3 CPU'yu da alıyoruz ve tam çekirdek de değiller, bu yüzden çok fazla kaçırmıyoruz) - bunun XBLIG olmayan XNA için geçerli olup olmadığından emin değilim oyunlar
  • Gerçekten belirsiz grafik hile yapmak için tam DirectX erişimi

Bunların yalnızca CPU tarafı kısıtlamaları olduğunu belirtmek gerekir. GPU'da hala tamamen ücretsiz erişiminiz var.

Ben böyle şeyler anlatılan bu cevabı etkin bir şekilde bu aynı sorudur ne. Bu cevapta bahsettiğim gibi XNA "profesyonel" gelişim için kesinlikle uygundur .

Bundan kaçınmanızın tek nedeni, C # yeteneklerini kiralayamamanız, C # motorlarını lisanslayamamanız ve mevcut C # kodunu mevcut C ++ bilgisinin tabanıyla aynı şekilde yeniden kullanamamanızdır. Veya C # 'ı desteklemeyen bir platformu da hedefliyor olabilirsiniz.

Tabii ki, "profesyonel" geliştirici olmayan birçoğumuz için, XNA, Xbox 360'a geçmek için tek seçeneğimiz ve bu noktayı tartışıyor.


Diğer sorularınızı cevaplamak için:

C # Hiçbir şey aslında veri odaklı yaklaşımlar kullanılarak durur tam olarak aynı şekilde sen C bunları kullanmak istiyorum ++.

C # kod derleme zamanında otomatik satır içi yeteneği yok ve (kontrol etmek için gitmeden) kompakt CLR JITter satır içi yöntemleri (masaüstü CLR olabilir) emin olamaz. Bu nedenle, performans açısından kritik kod için, C ++ 'da bazı yardımlar sağlayan C #' da el ile satır içi yapmanız gerekebilir.

Muhtemelen C #'daki çarpışma algılama ve sıvı simülasyonları gibi CPU-matematik yoğun şeylerini sık sık görmemenizin daha büyük bir nedeni, vektör birimine (yukarıda belirtildiği gibi) erişim eksikliğidir.


Kendimi hatırlayamıyorum, ancak C # basit dizilerle yinelemeyi durdurmuyor mu? Bunun hakkında int, float, char gibi birinci sınıf türlerini bir araya getirdiğini hatırlıyorum ve bu nedenle bazı veri odaklı yaklaşımlar olabildiğince hızlı çalışmıyor. Bu doğru mu? Ne hatırlıyorum?
Richard Fabian

2
C #, bir objecttüre atadığınızda değer türlerini (yalnızca gerçekler değil, kendi değer türlerinizi de oluşturabilirsiniz) kutulayacaktır . Ve sürüm 1'de (jeneriklerden önce) onları boks yapmadan dizi dışı bir kaba koyamazsınız. Ancak bugünlerde kutusuz kod yazmak son derece kolaydır. Ve CLR Profiler, boks yapabileceğiniz herhangi bir yeri tespit etmenizi sağlar.
Andrew Russell

JIT tercümanına sahip olmak bile mümkün mü? Paradoksal geliyor.
Komünist Ördek

Ben JIT yorum olarak sınıflandıracak birkaç dişli kod teknikleri gördüm. Kesinlikle bir uç durum.

1
" XNA Matematik Kütüphanesi " (DirectX'in bir parçası) ve " XNA Çerçevesi " çok talihsiz bir adlandırma çarpışmasıyla tamamen farklı iki şeydir. Bağladığınız belgeler XNA Framework için geçerli değildir. XNA Framework matematik türleri SIMD / Vektör birimini kullanmaz .
Andrew Russell

5

'Profesyonel'i tanımlamanız gerekir. Angry Birds, Plants vs Zombies, yapabilir misiniz? Kesinlikle. Crysis 2, COD, Halo yapabilir misin? Şüpheliyim. C # kullanmak sadece çok CPU yoğun olan ve her bir bellek baytını (çöp toplama işlemini kaybedersiniz) sıkmanız gereken oyunları etkileyecek, bu yüzden hala yapabileceğiniz çok şey var.

Başlayan insanlar için bir öğrenme aracı, prototipleme aracı, takasla başa çıkabilen oyunlar yazmak için bir platform olarak, harika, çok fazla güç ve basitliğe sahip, sadece ihtiyacınız olanı yapmak için tasarlanmamıştır. 'AAA' oyunlarını arayın. Ayrıca, çapraz platform taşıma ve uyumluluk ile insanların endişelenmesi gereken acı ve acıyı da ortadan kaldırır.

İnanılmaz bir oyun bulursanız ve XNA ile yapabileceklerinizin sınırlarına girerseniz, doğrudan MS ile iletişime geçmenizi öneririm, eğer fikir gerçekten yeterince iyi ise, sadece tam bir gelişmiş gelişimden ellerinizi almanıza izin verebilir seti.


Yine de berbat bir Duke Nukem devam filmi yapabilir misin? ;)
Jonathan Connell

1
Çoğu kıyaslama, C # kodunun, eşdeğer C kodundan (PC'de)% 30 ile% 70 arasında daha yavaş çalıştığını görür. Çoğu oyunun CPU'ya bağlı olmadığını ve ayrıca C # kodunun kritik kısımlarının, eşdeğer C kodundan neredeyse hızlı veya daha hızlı çalışabilecek güvenli olmayan kod kullanılarak yazılabileceğini düşündüğünüzde (JIT, bir derleyiciden daha iyi optimizasyon seçimleri yapabilir) , C # 'ın AAA oyunları için mükemmel yetenekli olduğunu görürsünüz.
BlueRaja - Dany Pflughoeft

@BlueRaja: Güvensiz kod, Xbox 360'ta çoğu XNA geliştirme için bir seçenek değildir.

1
@BlueRaja: unsafeKodun genellikle güvenli eşdeğerden daha yavaş olduğunu belirtmek gerekir, çünkü CLR'nin yapabileceği optimizasyon sayısını azaltır . Bunu ölçmelisin.
Andrew Russell

2
@Blueraja "Çoğu oyunun CPU'ya bağlı olmadığını düşündüğünüzde" alıntı çok mu gerekli? Tüm eksenlere bağlı olmayan profesyonel olarak geliştirilmiş bir oyun üzerinde çalışmadım. olmasaydı, yükü makinenin o kısmına kaydırmanın bir yolunu bulabilirdik!
Richard Fabian

3

Basit gerçek şu ki, ilginç bir oyun yapmak için yüksek bir çokgen sayısına, tam HDR aydınlatmaya veya dünyanın en ilginç fiziğine ihtiyacınız yok ve oyun planınız bunlardan herhangi birini içermiyorsa, neden daha hızlı gitmeyin? geliştirme zamanı çözümü?

daha profesyonel oyunların fizik modelleri ve animasyon sistemleri var

Bu açıkça yanlış. Profesyonel oyunlar, oyunlarını uygulamak ve sanatsal görünümlerini elde etmek için ihtiyaç duydukları şeylere sahiptir ve daha fazla ve gerçekten hiçbir şey daha az değildir. Bir oyun daha profesyonel değil çünkü daha gerçekçi görünüyor veya daha ayrıntılı fiziğe sahip. Profesyonel bir oyun, oyun, görsel hedeflerine zamanında, bütçeye vb. Ulaşır ve gönderir ve kâr eder.


1
Yüksek çokgen sayısı ve HDR grafik kartına düşecek, değil mi? Yani C # ve C ++ 'da tam olarak aynı performansı beklemelisiniz.
BlueRaja - Danny Pflughoeft

@BlueRaja: Bunlar için bir CPU maliyeti ve özellikle de 360'ta bir
bellek var.

Az ya da çok, grafik lib çağrılarında yerel kodda olduğundan biraz daha fazla yük var. Öte yandan, modern grafik kütüphaneleri, ana darboğazlardan biri olduğu için, sürücü başına çerçeve başına çağrı sayısını azaltmak için ÇOK çalışmaktadır.
drxzcl
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.