C ++ endüstri oyunlarında C # ile değiştiriliyor mu?


23

Endüstri oyunlarında Quake, CoD vb.


7
Size neyin fikir verdiğini kısaca açıkladıysanız yardımı olurdu, çünkü en azını söylemek çok garip bir fikir.
Konrad Rudolph

2
Quake göz önüne alındığında C. .. ;-)
Komünist Ördek

Sadece bu soruyu kendim merak ediyordum!
Jeff

2
"Endüstri oyunları" derken, "AAA başlıkları" denilen şeyi kastediyorsunuz.
kaos

Yanıtlar:


53

Bir anlamda, C ++ gerçekten değiştiriliyor - sadece C # ile değil, başka bir dilde. Ama sorarsanız, tamamen değiştirilecek mi - o zaman cevap kesinlikle hayır .

Çünkü C ++ geleneksel olarak iki kapasitede kullanılır. İlk olarak, oyun motorunu oluşturmak için : kaynakları yükleyen düşük seviyeli bileşenler, fizik simülasyonlarında çokgenleri taramaya ve sayılara çarpmaya zorluyor. İkincisi, oyun mantığını kodlamak için: oyunu yapan gerçek kurallar.

Bu ikinci kapasite, C ++ 'ın güçlü noktalarını gerektirmez (düşük seviye detaylar üzerinde tam kontrol gibi), ancak zayıf yönlerinden muzdariptir (hataya eğilimli elle kodlanmış bellek yönetimi gibi). Ve bu ikinci kapasitede C ++ farklı betik dilleri ile değiştiriliyor. Birçok geliştirici Lua kullanıyor; bazıları Python kullanır. Ancak bir CLI platformu varsa, .NET veya Mono biçiminde harika bir komut dosyası sunucusu adayı sunar. Bu platformlar oldukça hızlı, güvenilir, yaygın olarak bilinen bir dil (C #) ve kapsamlı bir temel sınıf kütüphanesi sunuyor. Araçları unutmayalım: MS Visual studio ve SharpDevelop / MonoDevelop, dünyadaki en iyi IDE'ler olmayabilir, ama oldukça iyiler.

Bununla birlikte, oyun motoru C # (ya da Lua ya da Python'a) yazılmayacak. Niye ya? Çünkü yeterince hızlı değiller.

Pek çok popüler inancın aksine, bugün yaşanan en büyük tek performans hafıza gecikmesidir . Bu, belleğe erişmenin ciddi bir iş olduğu anlamına gelir. Ve yönetilen diller kullanıcının bellek erişimini kontrol etmesine izin vermez - işte bu yüzden ilk etapta "yönetildikleri". Bu nedenle, hiçbir yönetilen dil gerçekten hızlı bir oyun motoru yazmaya izin vermez. Aslında, düşünebildiğim tüm büyük "C #" motorları - XNA, MOGRE, Unity - yerel C ++ koduna dayanıyor ; ancak C # ile oyun mantığı yazmanıza izin verin.

Özetlemek gerekirse : C #, C ++ veya diğer dillerin yerine kullanılacaktır. Ancak, en azından biri gecikmeden, anında erişilen bir bellek bulana kadar C ++ 'un yerini asla alamaz.


16
+1 Visual Studio çok iyi bir IDE. Karanlık taraf olsa bile ...
Michael Coleman

1
Bah, deneyimlerime göre C #, simülasyon için de yeterince hızlı değil, ama bu insanların denemesini engellemiyor.
BigSandwich

@Nevermind "Yönetilen diller" nedir?
Quazi Irfan

3
@iamcreasy Geniş anlamda, "Yönetilen diller" derken, bir miktar çöp toplama ve / veya bellek yönetimi içeren sanal makine altında çalışan dilleri kastediyorum. Daha kesin olarak, yönetilen diller Ortak Dil Çalışma Zamanı'nı (bazı uygulamalarını) hedefleyen dillerdir, ancak cevabım yalnızca onlar için geçerli değildir.
Nevermind

Sizce referans sayılan GC planları bu kategorinin altında bir la Vala mı?
weberc2

6

Dil seçimi büyük ölçüde platforma bağlıdır. Şu anda bir Microsoft platformundan başka bir şeyin aslında bir uygulama olarak .NET'i gerektirmesi pek olası görünmüyor.

Geleneksel bilgelik, küçük bir platformun performans göstermesi için metale yakın olması gerektiğini söylerdi, ancak diğer taraftan, yönetilen platformlar daha güvenlidir . Muhtemelen Windows Phone 7'nin sizi .NET kullanmaya zorlamasının nedeni budur.

Yeni bir Xbox'ın yönetilen bir platform gerektirmesi kesinlikle ilginç olurdu. Bir telefonun donanımını kaldırabilirse (ve yaparsa), onları tam boyutlu bir konsolda kullanırken kesinlikle görebiliyordum. Tüm oyun kodunuzu bir betik dilinde yazmadan platformlar arası oyunlar yazmak daha zor olacağından, konsol ekosistemini biraz karıştırır. Bu durumda, C #, C ++ 'ın yerine geçmez , ancak el ele giderdi.

Şu anda sen olabilir (Birlik ne benzer) bir betik arka uç olarak Mono kullanmak, ama bunun çoğu motor üreticileri ya kendi rulo isteyeyim hayal veya C # daha Lua veya Python gibi daha kompakt kullanım şey olacaktır.

Her iki durumda da, her şey doğru iş için doğru araçla ilgilidir. Her iki dili de gerçekten öğrenmelisiniz, çünkü C # bazı şeyleri kolaylaştırmayı kolaylaştırır (araçlar geliştirme, sunucu geliştirme, vb.) Ve bazı durumlarda C ++ dışında bir şey kullanamazsınız.


Şu an itibariyle, 3 yıl sonra oyun geliştirme için C # durumu çok daha gelişti. Mono-Project, XNA Game Studio'yu aldı ve MonoGame'i yeniden adlandırdı. SharpDX, SlimDX ve OpenTK hepsi çok iyi opengl / directx sarmalayıcılarıdır. C # da birkaç fizik motoru bile ortaya çıktı. Mono / MonoGame, bir kez oyun oluşturmanıza ve android, linux, mac os, ios, xbox 360, ps3, ps4 ve wii'ye otomatik olarak bağlanmanıza olanak tanır.
Ryan Mann,

3

Bu olası değil. C ++ düşük seviyede olma avantajına sahiptir, böylece geliştiriciler mümkün olan en iyi performansı elde etmek için en ince ayrıntıyı ince ayarlayabilirler.

C # ve .NET ile çok faydalı olan çöp koleksiyonuna sahipsiniz, ancak sınırlı bellek ve depolama platformları (taşınabilir konsollar ve bir ölçüde ev konsolları) ile çalışırken, en iyi kullanımı sağlamak için bellek üzerinde mümkün olduğunca fazla kontrol sahibi olmanız gerekir Kaynakların Yönetilen dillerin sizin için bellek ayırmalarına ve boşaltmalarına izin vermek büyük olasılıkla size birçok soruna neden olur.

Hız da bir sorun (muhtemelen daha az olmasına rağmen). Zamanla, C ++ derleyicileriyle karşılaştırılabilir şekilde performans göstermek için yönetilen dillerin yapılabileceğinden eminim.

Genel olarak, deneyimlerime göre, oyun geliştiricileri, bellek, CPU zamanları ve kaynakları (olabildiğince performansı sıkmak için) söz konusu olduğunda kontrol düşkünleri olma eğilimindedir, bu nedenle C / C ++ en çok kullanılan dillerdir.


2

AFAIK .NET GC hala dünyayı durduruyor tarzı algoritması . Bu, çok çeşitli uygulamalar için uygun olsa da, oyunlar gibi gerçek zamanlı uygulamalar için kabul edilemez.

Aslında, GC'de bazı atılımlar olana kadar, yönetilen dilleri gerçek zamanlı programlar için etkili bir şekilde kullanmak çok zor.


1

Hayır. .NET'e bağlı olarak, PS3 gibi kullanılabilir Çerçevesi olmayan platformlar için büyük yeniden yazma anlamına gelir ve performans dezavantajları PC veya Live Arcade oyunları için mükemmel şekilde kabul edilebilir, ancak daha büyük oyunların her bir hurdaya ihtiyacı olacak Konsollarından performansı yeterince hızlı çalıştırmak için. Bundan da öte, C ++ 'ta hiç kimsenin yükseltmeyi göze alamayacağı kadar geniş bir kod tabanı var. C ++ oyun endüstrisinde ve uzun süre orada kalacak.


Atalet mevcut olsa da, C ++ kod tabanları o kadar eski değildir - belki de en fazla 10 yıl. Neredeyse tüm kodlar bu dönemde değiştirildi - 3B hızlandırıcılar, programlanabilir boru hatları, veri odaklı mimariler ve komut dosyası desteği için. Eğer bir AAA geliştiricisi C # 'a tam geçiş yapmak istiyorsa, muhtemelen üç oyun alanı içerisinde minimum maliyetle başarabilirdi - ilk önce bir araç ve komut dosyası sunucusu olarak kullanın, ikinci olarak oyun mantığı katmanlarını ona taşıyın ve üçüncü port Oluşturucu, yönetilen bir DX / GL sarıcı kullanmak için.

1
Mono'nun PS3 için ticari bir .NET çözümü var.
Dan Olson,

İkincisi, oyununuzu c # ile mono ya da monogame (xna değiştirme) ile oluşturursanız, ps3 / ps4, wii, xbox 360, android, max os vb. Noktalarına yerleştirebilirsiniz.
Ryan Mann

0

Bilgisayar gücünün az olduğu zamanlarda, herşeyin C veya C ++ 'da programlanması gerekiyordu, çünkü toplanan çöp dilleri programlayıcıdan bellek kontrolünü eline alıyor ve böylece performans düşebiliyor.

Günümüzde, bilgisayarlar daha hızlıdır, ancak Knuth'un dediği gibi ve kısaca söylemek gerekirse, optimizasyon kötü olabilir:

  • Düşük seviyeli çekirdek işlevselliklerinin optimize edilmesi gerektiği açıktır, çünkü bilgisayar 3D geometrisi, fizik, çarpışmalar, aydınlatma, mevcut en iyi işlemciyi hızla şişirebilir. Bir makinedeki artan görsel kalitenin, neredeyse her zaman performansı önemli ölçüde düşürdüğünü kolayca söyleyebilirsiniz.

  • Şimdi, bir oyunda hala önemli olan ancak hiçbir zaman bilgisayar kaynağını almayacak olan oyun durumları, AI, ses, giriş, ağ gibi başka işlevler de var. Bu işlevler çoğu zaman optimize edilmek zorunda değildir. Bu betik dili ve çöp toplanan dillerin hedefidir: bellek tutarlılığınızı ve uygulama organizasyonunuzu düşünmeniz gerekmez, çünkü bu dillerle yazacağınız kod, eğer düşük seviyeli kodlama yapmazsanız, asla darboğaz.

2 vaka örneği

  • 500kg mobilyayı bir kamyonla gönderin.
  • Bir tekne ile 30 ton malzeme gönderin.

her ikisi de 500 km uzaklıktadır.

Her iki durumda da, tüm taşıma süresini kısaltmak için yükleme / boşaltma işlemlerinin daha hızlı yapılması, CANT'ın teknenin veya kamyonun daha hızlı hareket etmesini sağladığını bilmek önemli mi?

Cevap: kamyonla önemliydi, ancak artık botla değil, çünkü stoğu botla hareket ettirerek çok şey yaptınız.

Bu metaforu anlıyor musunuz bilmiyorum, ama bir şekilde, cevabı anlamaktan daha önemli olan matematiksel problemi hayal etmenizi sağlayabilir.

Komut dosyası dilleri, daha önce C / C ++ ile programlanmış bir motorunuz varsa oyunları daha hızlı hale getirmenize olanak sağlar: 3D motoru, düşük seviye sorunlarını çözer, şimdi oyunu komut dosyalarınızla yapmanız gerekir.

Ancak unutmayın: kesinlikle hiçbir zaman düşük seviyeli derlenmiş dilin yerine, asla geçemezsiniz. Statik olarak yazılmış, derlenmiş diller performansın çekirdeğidir ve onları bir çekirdek, bir 3D motor veya bir grafik kartı sürücüsü olmaktan çıkaramazsınız.

Ama elbette, eğer oyununuz grafiksel olarak basitse ve çok fazla vektör hesaplama gerektirmiyorsa, oyuna odaklanabilir ve optimizasyonu unutabilirsiniz çünkü bu durumda makineniz gerçekten hızlı olduğu için optimizasyonla uğraşmak zorunda kalmayacaksınız. bunun için

Sadece DS'ye bağlanmayı planlıyorsan hariç. Ama orada duracağım.


1
"optimizasyon kötü olabilir" ifadesinin okuduğum ifadesinin en yararsızca mutasyona uğramış versiyonudur.

Peki, açıklıyorum, bu yüzden oldukça uzun bir cümle olan ve gerçekten açıklanmayan bir ifadesinin tamamını açıklamakta faydasız buldum ... Bunun üzerine, aynı olmayan oyunlardan bahsediyoruz. daha geniş bir yazılım Knuth hakkında konuşmak istedi.
jokoon

Bu girişin pek çok bilgisayar kaynağını kapladığını söylemezsiniz. Oyuncunun oyuna fiziksel olarak daha fazla bağlı olması ile bunun daha az gerçek olacağını belirtmek isterim. Örneğin, kinect. Bu bir girdi biçimidir, ancak yararlanmak için çok fazla bilgi işlem kaynağı gerektirir.
Ponkadoodle

0

Bak, bunun bir rant olduğunu biliyorum ama sadece saçları bölmek istemiyorum. Çoğu programcının bunu bir araya getirmediğini hissediyorum. Bir dilin kendisinin çalışma hızı / performansı ile ilgisi yoktur. Bu derleyici / çerçeve. Gcc'ye cl (microsoft compiler 2010 öncesi) veya msbuild (2010 için geçerli c ++ compiler) aleyhine tartışabilirsiniz. Bu derleyicilerin her sürümü daha iyi hale gelir, bu nedenle bunları önceki sürümleriyle karşılaştırmanız gerekir. Net ile çok etkilendim ve iyi bir performans sergiliyor ama biraz daha iyi performans olsa bile, devraldığını göremiyorum, bir neden: taşınabilirlik.

AAA oyunları Windows, Linux, Mac, XBox, PS3, Nintendo, vb. Olmak istiyor.


Elbette, derleyici uygulaması bir rol oynar, ancak farklı diller, derleyici temelli optimizasyon için farklı özellikler ve programcıların normal dil kurallarını aşmaları ve donanımla doğrudan konuşmaları için farklı ilişkiler sağlar. Dil ve hedef başına performans ile yapılacak çok var.

Bir dilin çalışma hızı / performansı ile ilgisi olabilir, çünkü sözdizimi ve standart kütüphaneler farklı yaklaşımları tercih eder. Örneğin, tüm nesnelerin işaretçi olması nedeniyle bitişik bellek dizilerini kullanmanın zor olduğu bir dil, önbelleği dizileri veya vektörleri etkin bir şekilde kullanabileceğinizden çok daha fazla sallama eğilimindedir.
Kylotan

Aptal insanlara hakaret etmeden yapabileceğin çok iyi bir nokta + 1, kim olduklarını bilmiyorlar.
Yangın Karga

Bunun dışında, bugün itibariyle, monoya karşı inşaa edebilirsiniz ve hemen hemen her şeyi barındırıyor. Örneğin şimdi çok taşınabilir.
Ryan Mann,
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.