Oyun geliştiricileri için neden C / C ++ tercih ediliyor?


14

Bazı insanlar geliştiricilere daha fazla kontrol sunduğunu söylüyor, ancak örneğin Java ile kontrol edilemeyen C ++ ile kontrol edilebilen tam olarak nedir?

Yanıtlar:


21

Java sanal bir makinede çalışırken C ++ doğrudan donanımda çalışır. Bunun anlamı, belleğinizin nereye gittiği ve C ++ ile neler yapıldığı üzerinde daha fazla kontrole sahip olmanızdır.

Java, çöp toplanmış bir dildir. Belleğiniz üzerinde doğrudan kontrolünüz yok. Yeni bellek parçaları ayırabilirsiniz, ancak silindiğinde (ince) kontrolünüz yoktur. Çöp toplayıcı, her x karede ayırdığınız her bellek parçasını kontrol eder ve çöp olup olmadığını veya kullanılmaya devam edeceğini belirler.

Oyunlar için bu felaket olabilir. Her birkaç karede bir çöp toplayıcı hala kullanılmakta olup olmadığını görmek için yaptığınız her tahsisi kontrol etmek için geliyor mu? Yavaşlama hakkında konuşun!

İkincisi, kullandığımız kitaplıkların çoğu ya C dilinde yazılmış ya da C ++ dilinde yazılmıştı. Scaleform, Havok fizik motoru, PhysX, SpeedTree vb. Hakkında konuşuyorum. Sektörde yaygın olarak kullanılan tüm profesyonel paketler. Başka bir dil kral olmak istiyorsa, onları desteklemesi daha iyi olur.

Kişisel görüşüm, Java'nın masaüstü uygulamaları ve uygulamaları için gerçekten iyi olduğu, ancak oyunlar için değil. Java, geliştiriciler için çok güzel araçlara sahiptir ve teorik olarak Java Sanal Makinesi uygulamasına sahip herhangi bir platformda çalıştırılabilir, ancak yine de C ++'ı tercih ederim çünkü hafızam üzerinde bu kontrole ihtiyacım var. Özellikle egzotik veri yapıları ile çalışmaya başladığınızda (kırmızı-siyah ağaç, çift bağlantılı liste vb.) Tüm bellek ayırmalarınız hakkında iyi bir genel bakış elde etmenize yardımcı olur.

Söylemiyorum: Java kullanma. Diyorum ki: Java'yı neden kullandığınızı düşünün. Minecraft Java ile oluşturulmuştur, bu yüzden Java'da oyun oluşturmak kesinlikle mümkündür. Ama daha iyi bir oyun olurdu, C ++ ile inşa edilmiş miydi? Eh, büyük üç (Windows, MacOS, Linux) üzerinde çalışmasını sağlamak o kadar ucuz olmazdı, ancak buna rağmen, geliştirilmesinde platforma özgü birçok hatayla karşılaştı, Java'nın düzgünleştiremediği hatalar bitmiş.

Şimdi programcıları başlatmak için tonlarca C ++ çerçevesi var. Özellikle sektördeki kariyerinizi ilerletmek istiyorsanız, bunu öğrenmemek için hiçbir bahane yoktur.


1
Sadece bir nitpick, ancak çoğu işletim ortamında yerel kod sanal bir makinede çalışır. Java, sanal bir makinenin içindeki sanal makinede çalışır.
Skyler Saleh

1
@RTS: Eğer sanal bir makineye op -> mikro-op çeviri demek biraz zor.

Hayır, güvenli çoklu görev yapabilmek için tüm uygulamaların modern işletim sistemleri tarafından yerleştirildiği sanal makineden bahsediyordum. Bu, mikro-ops (RISC) olmayan mimarilerde çalışan işletim sistemlerinde gerçekleşir. Buna sanal bellek, yazılım kesintileri, eşzamanlı donanıma erişim sistemleri, işletim sistemleri zamanlayıcısı ve kayıt dosyasının işlenmesi dahildir.
Skyler Saleh

@RTS Görev yalıtımının gerçekten bir VM olarak nitelendirildiğinden emin değilim. İçinde bazı koruma bulunan bir RM (Gerçek Makine). Getirme / exec arasında açık bir talimat soyutlama katmanı yok. Derleyiciler ve bağlayıcılar, gereksinim olarak yeniden yerleştirilebilir kod üretir. CPU, bunun birçoğu için "sanal" yönü kaldıran donanım desteği sağlar.
3Dave

2

Kısa cevap: C ++ yerel kodu derler, bu nedenle performans bir çalışma zamanı veya VM değil, geliştiriciye bağlıdır.

Uzun cevap:

C ++ 'ın "daha hızlı" olmasının C ++ ile ilgisi yoktur. Şu anda, birden fazla platform için bağımsız, yerel kod üreten araçlar tarafından desteklenen çok az dilde biridir.

Gün içinde, C, C ++, BASIC / 2, Delphi, vb. Kullanabilir ve verimli, bağımsız yürütülebilir dosyalar elde edebilirsiniz. Dil seçimi kişisel tercih ve pazar güçleri meselesiydi.

Bu günlerde, LLVM bir zamanlar olduğu gibi ayrıştırıcı grubuna giren her şeyi yaptığı için bunu değiştirmek için iyi bir konumda olmasına rağmen, "C ++ daha hızlıdır" varsayımı aslında kendi kendini gerçekleştiren bir kehanettir.

Borland haklıydı: Ayrıştırılan birden fazla dil, önce optimizasyonlar uygulandı, daha sonra ortak bir arka uç derleyicisine ve bağlayıcısına geçti. Hangi etkili LLVMs büyük başarılarından biridir.

Java, JVM olmadan uygulanması çok zor olacak şekilde yapılandırılmıştır. Garip bir şekilde, C #, yaygın ve yanlış, Java'ya kabaca eşdeğer olduğu varsayılır, zaten iOS da dahil olmak üzere çeşitli platformlarda yerel kodu derler.

Noel listemin en üstünde mi? C ++ 'a geri dönüp özellikler, gerçek istisna işleme ve gerçek ÇALIŞMA polimorfizmini eklemek ve ayrıştırıcının kendi başına çözebileceği f "d yukarı ok sözdizimi bokundan kurtulmak için bir zaman makinesi. 10 yıl boyunca bir önişlemci yazdım önce aptalca bir şey çünkü.


Şunu mu demek istediniz: dolaylı üye erişimi (h-> x de)? Bunu kaldırmak, tanıtıcı ve akıllı işaretçi türlerini daha az kullanışlı hale getirir. Yalnızca ham işaretçiler için değiştirmeyi düşünüyorsanız, dili daha az tutarlı hale getirdiniz.
Lars Viklund

1
C ++ 'ın polimorfizmi hakkında ne işe yaramaz?
Casey

@LarsViklund evet, demek istediğim bu. Ancak, adres, dereference ve üye operatörlerin (&, *, ::, -> ...) farklı anlamları olsa da, çoğu zaman drsjted sonucunu bağlamdan çıkarmak mümkündür. Diğer dillerde yapıldığı gibi, işler önceden basitleştirilebilirdi. Küçük bir yapışma noktası, ancak kod karmaşıklığını arttırma potansiyeline sahip bir nokta (ve böylece dev zaman ve maliyet).
3Dave
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.