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.
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.
Yanıtlar:
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:
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 3
kesme 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ı.
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.
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 .
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.