Modern oyun kodunda gerçekte ne kadar montaj kullanılıyor? [kapalı]


21

Ortalama olarak, derleme modern oyun kodunda ne sıklıkla kullanılır?

Özellikle, x86, PPC veya ARM gibi zaten iyi C ++ derleyicileri olan platformlarda - gömülü sistemlerdeki oyunları montajın geniş ölçüde kullandığını varsayıyorum.


4
C ++, derleme için derleme yapmaz - makine koduyla derlenir. Assembly dili, tam olarak hangi makine kodunu oluşturmak istediğinizi doğrudan belirlemenin bir yoludur.
Kylotan

6
C ++ (genellikle) aslında derleme için derlenmedi, doğrudan makine koduna derlendi. Buradaki soru muhtemelen el ile yazılmış montajın bir projeye ne kadar bağlı olduğu ya da satır içi montaj olarak yazılmasından kaynaklanmaktadır.

1
Ne olursa olsun, bu sorunun pratik ve faydalı bir cevabı olduğunu sanmıyorum. Temel olarak, çoğu öznel olan bir başka faktöre (yani, kod yazarlarının görüşlerine) dayanır.

1
SPU programlama gibi bazı istisnalar dışında, bugünlerde çok fazla yazı yazımı önemli değildir, ancak bunu okuyabilmek kaza dökümlerini analiz etmek için önemlidir
Maik Semder

4
@Legion - Eğer derleyici / IDE neden olabilir yayarlar montaj, ama bu derleyici normal derleme sürecinin bir parçası olarak montaj üretir anlamına gelmez. Bunu yapması için gerekli değildir ve sonuç olarak çoğu yapmaz.

Yanıtlar:


29

Cevap biraz "oyun" derken ne kastettiğine ve "kullanılmış" dır. Belirli bir oyun projesi boyunca yazılan "kullanılmış" anlamına geldiğini farz ediyorum.

Tecrübelerime ve konuştuğum kişilerin anekdot verilerine göre:

  • tarayıcı tabanlı oyunlarda? Yok.
  • tipik PC oyunlarında? Yok. (Fakat bazılarını düşük seviyeli kütüphanelerde görebilirsiniz.)
  • iOS ve Android oyunlarında? Yok.
  • "AAA" PC oyunları ve konsol oyunları? Belki biraz, belki de kod tabanının% 0,05'i. (Kütüphanelerde biraz daha fazla)

Meclis dili bilgisinin oyun endüstrisinde çalışması beklenmez, ancak yaptığınız oyun türüne bağlı olarak avantajlı olabilir.

Derleyicinin, C kodunu optimize etmek için elle yazılmış montajla bir insandan daha iyi bir iş çıkardığı bir tartışma vardı. Genellikle doğru, bazen yanlış. Ancak bu günlerde, giderek artan CPU karmaşıklığı ve 'genişletme' (yani işlemcileri ayırma) gereksinimi kombinasyonu, optimizasyon çabalarının genellikle başka bir yerde harcanması anlamına geliyor.

Geçtiğimiz yıllarda oyun kodunda derleme gördüğüm tek zaman __asm int 3kesme noktalarını zorlayan ifadelerdi ve tek kişisel montaj kullanımım olağandışı çarpışma hatalarını teşhis etmek için bir fonksiyonun sökülmesine bakmaktı.


1
Peki ya SSE talimatları?
Legion

4
@Legion, insanlar genellikle SSE kodunu kendi içlerini kullanarak veya SSE öğelerini saran matematik kütüphanelerini kullanarak veya ispc gibi SSE'ye derlemek için özel olarak tasarlanmış özel bir mini dilde yazarlar . Düzeneği doğrudan yazmak hala oldukça nadirdir.
Nathan Reed,

1
İOS Oyunlarına İlişkin: Doğru hatırlıyorsam, Oolong 3D / Matematik kütüphanesi bazı satır içi ARM montajları kullandı. Apple Accelerate çerçevesini yayınladığından bu artık gerekli değil.
Nicolas Miari

Nathan - SSE ile anlaşmaya varıldı ve talimatlara özel benzer optimizasyonlar genellikle kütüphanelerde var (zira genelde kazanılan toplam faydanın harcanan emeğe değeceği tek yer oldukları için).
Kylotan

26

Modern konsol oyunlarındaki yüksek performanslı kodun büyük bir kısmı, derleme ile C ++: derleyici gerçekleri arasında bir tür orta yol kullanılarak yazılmıştır . Bu yapılar C ++ işlevlerine benziyor ve ayrıştırılıyor, ancak aslında tek makinenin komutlarına çevriliyor . Bu nedenle, örneğin, "V vektörünün her bir değerini" = a ve <= b "olacak şekilde ayarladım

// for each v.x, ensure v.x >= a.x && v.x <= b.x
inline __m128 ClampSIMD( const __m128 &v, const __m128 & a, const __m128 & b )
{
    return _mm_max_ps( a, _mm_min_ps( v, b ) );
}

Bunun gibi fonksiyonlarda , belirli makine talimatlarını hala düşünüyorum , ancak bunları C'ye yazma rahatlığına sahibim, böylece renklendirme ve zamanlamayı kaydetme konusunda endişelenmeme gerek kalmıyor ve opları ve diğer sıkıcı ayrıntıları yükleme.

İşlemcinin hangi talimatları desteklediğini hala bilmeniz gerekiyor, çünkü modern derleyiciler akıllı bir insanın işi ne kadar iyi yapabildiğine kıyasla vektör kodlamada korkunç. Ayrıca, bazen kodunuzu nasıl düzenlediğinizin ince ayrıntıları , makinenin ne yaptığını anlamadan açıkça belli olmayan performans için çok büyük etki yaratabilir .

Montajda kod yazmamıza rağmen, hala montajda çok hata ayıklarız. Derleyicileri en iyi duruma getirme, agresif bir şekilde kodları, hata ayıklayıcıların yetişemeyeceği şekilde yeniden düzenler; bu nedenle, sık sık "sürüm modu" hata ayıklaması yaparken yapılacak en iyi şey, disassembler'ı açıp kodu bu şekilde izlemektir. GDC'nin “Adli Hata Ayıklama” konusundaki konuşması , bu seviyedeki hataların ve nedenlerin çoğunun nedenlerini göstermektedir.


3
+1, Crashworks'ün SO'da “oyunlar için gerçekten düşük seviyeli optimize edilmiş kod yazan adam” olarak bilinmesi nedeniyle - bu konuyu bilen biri varsa, odur.
BlueRaja - Danny Pflughoeft

@ BlueRaja-DannyPflughoeft "İyi bilinen"? Koltuklarım kabardı! =) Nathan Reed'in yorumları ışığında eğlenceli bir tesadüf, Naughty Dog'da düşük seviye optimizasyon becerilerimin çoğunu öğrendim.
Crashworks

Başka yerlerde montajın hata ayıklamadaki önemini de duydum. Bu yüzden öğreneceğim. İçgörü ve bağlantılar için teşekkür ederiz.
Legion

7

Elle haddelenmiş montaj gerektiren problemler sayıca azalıyor. Hızla "kazanabileceğin" şeyleri okunabilirlik ve hata ayıklama yeteneğinde kaybedersin. Ayrıca, çoğu durumda hız sorunları montaj ile daha iyi hale getirilemeyecek bir şey olmadığından, kod bölümlerindeki en son optimizasyon adımlarından biri olarak yapılmalıdır. Bugünlerde CPU'lar çok daha hızlı bir şekilde artmışken, bellek hızları değişmedi, çoğu zaman verilerin CPU üzerinden nasıl aktığını kontrol etmek her şeyden daha önemlidir.

Modern derleyicilerle birlikte, montaj kodu etrafında optimize etmekte zorlanırlar çünkü dokunduğunuz kayıtlarla uğraşmak zorunda kalırlar ve genellikle el yapımı kodunuzdaki talimatları yeniden sipariş edemezler. Montaj ihtiyacını azaltmak için, şimdi orada da intrinsics düşük seviyeli kavramlara erişmek için yardım ancak derleyici dostudur ve sizinle ziyade karşı işe de izin ver bir şekilde.

Bununla birlikte, PS3'teki SPU, insanların burada işlemciden en iyi şekilde yararlanmak için montajı kullanmak zorunda kaldıkları bir alandır, örneğin burada açıklandığı gibi manuel talimat boru hattıyla .


1
PS3'te bile insanlar genellikle çıplak montaj konusunda pek program yapmıyorlar . Makine talimatlarını belirlediğiniz montaj benzeri sözdizimine kod yazmanıza izin veren bir araç var, ancak sizin için kayıt tahsisi, talimat çizelgeleme ve döngü boru hattı işlemlerini yapıyor. Şey, belki Naughty Dog gerçekten hepsini elle yapıyor, fakat çoğu PS3 SPU geliştiricisi benim tecrübeme dayanmıyor. :)
Nathan Reed,

1
@NathanReed PS2 günlerinde, manuel döngü boru hattı aslında Naughty Dog'un programcı röportajının bir parçasıydı.
Crashworks

-1

Gerçek şu ki, çok platformlu bir dünyada yaşıyoruz ve oyun kodumuzun bölümlerinin yerel platforma uyarlanması gerekiyor - tabii ki buna gerek yok, ancak yerel donanım malzemesinden faydalanırsak faydaları da var!

Bu, oyunlar ya da oyun mantığı ile ilgili değil, oyun mantığının dayandığı kodun en iyi performans göstermesi için donanım konumuyla ilgili. Gerçekten de üzerinde çalışan bir kaynak kodun olduğu bir kod gibi, örneğin makro kullanarak kod bölümlerini sarabiliriz. platform karşı inşa edilmiştir.

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.