Oyunlar için STL, evet mi, hayır mı? [kapalı]


144

Her programlama dilinin standart kapsayıcıları, algoritmaları ve diğer yardımcı öğeleri vardır. C #, Java ve Python gibi dillerle, dili standart lib olmadan kullanması neredeyse imkansızdır .

Yine de üzerinde çalıştığım birçok C ++ oyununda ya STL'yi hiç kullanmadık, ya da çok küçük bir kısmını kullandık ya da kendi uygulamalarımızı kullandık. Bunun oyunlarımız için sağlam bir karar olup olmadığını veya STL’nin cehaletinden birisini söylemek zor.

Öyleyse ... STL uygun mu, değil mi?



1
Evet, demek istediğim "kendi uygulamamızı kullandık". :)
munificent

3
Best of Game Programming Gems'i bulma ve satın alma fırsatınız varsa bunu yapın. STL'yi kullanmanın gerçekten iyi bir örnek olacağı ArenaNet'ten James Boer, "Oyun Programında STL'yi Kullanma" başlıklı bir makale var.
chiguire

Aslında standart lib olmadan Java kullanarak, bu J2ME oldukça akla denir edilir: p
Bart van Heukelom

1
Harika soru!
Alan,

Yanıtlar:


191

Profesyonel oyun geliştirme alanında çalıştığımda, STL çok olgunlaşmamış ve şişmişti. Fakat bu> 10 yıl önceydi.

Şimdi daha zorlu performans gereksinimlerine sahip askeri simülasyonda çalışıyorum (kare hızı hiçbir zaman FPS'nin altına düşmeyecek gibi). Askeri simülasyonda her yerde STL kullanılıyor.

Size STL kullanmamanızı söyleyenlerden bazıları, sorunun her zaman mükemmel veya hatta en iyi çözüm olmadığı iddiasını kullanır. Ancak bu sorunun cevabı değil. Soru şu olmalı: STL'yi oyunlarda kullanmakta doğal olarak yanlış bir şeyler var mı? Hayır derim, STL çoğu zaman bir kullanıcının kendi başına bulabileceğinden daha iyi bir uygulamadur.

STL'yi nasıl kullanacağınızı bildiğinizden emin olun ve oyununuzda kullanın. Bazı kitapları okuyun ve kullandığınız STL'deki uygulama koduna bakın.


49
Bu oldukça sağlam bir tavsiye. "STL yavaştır" meme, en az beş yıl ve muhtemelen çok daha uzun bir süredir doğru değildi. "Java yavaş" ve ".NET yavaş" saçmalıkları gibi, artık durumun olmadığı herkes tarafından anlaşılıncaya kadar yaşamaya devam edecek . STL daha iyi programlar yazmanıza yardımcı olur; Bunu kullanmamayı, çoğu durumda (bir yerde% 0,1'in dışında) sorumsuz olduğunu söylemeye kadar giderdim. (. Verilen bir sorun alanını uymuyor iddialar sorun ele şeklinden iddianamenin genellikle daha fazladır, STL kendisi Fix değil sizin , millet kodu.)
Ed Ropple

5
@Ed Ropple: Meselenin STL'nin verilen bir probleme uymadığını düşünüyorum, mesele kodun kodunu karmaşık hale getiren çok fazla soruna uyması. İnsanların STL'yi nasıl aşırı kullandığı ürkütücüdür ve bunun pek çoğunun (kendim dahil) onu kullanmaktan kaçınmasının nedenlerinden biri olduğunu düşünüyorum. Bir örnek gibi, uzun zaman önce sorunun 3 sayıdan en büyüğünün nasıl elde edileceği olduğunu gördüm, cevaplardan biri onları bir std :: vector öğesine itiyordu ve sonra std: sırala. Bu kesinlikle gereksiz bir çözümü çok basit bir soruna zorluyor.
Simon

22
@Simon: tüm saygımla, son örnek aşırı uçsuzluğun bir işaretidir ve STL ile ilgisi yok ... o kişi, sıralanabilecek listeleri içeren başka bir dilde aynı şeyi yapardı. Bu onun düşüncesi kırılmış.
ggambett

@EdRopple, PPM görüntü dosyaları için bir STL ayrıştırıcısı uygulamaya çalışın (yalnızca P6 veya P3'ü hedefliyorsa toplamda 100 satırdan az kod). Sonuçta ortaya çıkan kodun yarısı sadece yorum satırlarını atlamak içindir, çünkü STL gibi bir şey sağlamazif(stream.nextCharacter() == '#') stream.skipLine();
GameDeveloper

@DarioOO Bu dosya biçimini bilmiyorum, ancak akış uyarlayıcıları ve filtreleri bunun içindir. Bu yorumu beş yıl önce yazdım, akıl (ve bazen de geri gelmeye devam ediyor!) Ama bu günlerde, işlevsel, dönüşüme dayalı bir tarzda süper, süper mükemmel olmayan bir şey ve sizin gibi konular hakkında yazarım. Sorununun düştüğünü açıklıyoruz. Gerçekten tüm bu çizgi sayınızdan çok fazla önemsemiyorum (IMO ve ne yapmanız gerekir), o zaman uygulama doğruluğu, açıklık, daha sonra performans ve umurumda sonra kod uzunluğu gibi şeyler.
Ed Ropple,

63

Tam olarak bilmediğiniz sürece, kafamın üstünden STL kullanmak daha iyi bir fikirdir. neden kullanmak istemediğinizi .

İşte STL ile ilgili bir şey: sizden daha zeki insanlar tarafından geliştirilmiştir. Bu, rahatsız edici veya herhangi bir şey için tasarlanmadı, sadece STL, çalışmaları gerçekten STL'yi oluşturan insanlar tarafından geliştirilir. Platform izin verebileceği kadar pratikte hızlı olacak ve genellikle evden alınacak bir çözümden çok daha sağlam olacak (ve eğer daha fazla olmasa bile bu kadar endişe verici olmalı) ham hız konusunda endişelenmekten fazlası çünkü oyununuz ihtiyaç duyuyor) sağlamlık sizin hızınızdan gerekenden biraz daha fazladır; ikincisi eskisi olmadan anlamsızdır).

STL’nin “dünyanın dar görüşünü” yürüttüğü şikayetleri beni biraz aptallaştırıyor. Onlar konteyner. Sınırlı işlem kümeleri vardır, çünkü konteynerlerin sınırlı işlem kümeleri vardır. Ne yapıyorsun bununla başa çıkmıyor?


4
Birisinin neden STL kullanmaması gerektiğini haklı göstermesi gerektiğini düşünmüyorum. Ayrıca, tüm 'onu kullan çünkü onlar senden daha akıllılar' argümanı ile aynı fikirde değil. STL bir sorun alanının belirli bir görünümle etrafında dizayn edilmiştir, sadece kaplar yeterince adil ama bu sorun etki bakmanın tek yol değil bu vb algoritmalar, ayırıcılar, iterators, özellikleri yani
zebrabox

2
Yani, genel olarak test edilmiş, çok sağlam bir koddan ziyade evinizde yayınlanmış kod mu istiyorsunuz? Sorun alanı projeden projeye o kadar da farklı değil (belki gömülü projeler dışında - konsolların bile bugünlerde iyi STL uygulamaları var!). Oyuna bakılmaksızın, sorununuz o kadar da farklı değil ve eğer göndermeyi planladığınız bir şey yapıyorsanız, sağlam kod yazma sorumluluğunuz vardır. Tekerleğin yeniden takılması daha iyi sağlamlık ve esneklik sağlayacak mı? "Hayır" a yaslanıyorum. Bunun "tek yol" olmadığı, genellikle üstün olmadığı anlamına gelmez.
Ed Ropple

20
Gamedev'in oyun yapmakla ilgili olduğunu söyleyebilirim ama tamam. Varsayımlarınız o kadar zayıfsa, bu tür bir kaynak tahsisi için delinirsiniz, o zaman evet, geri adım atmanız ve bunları yeniden değerlendirmeniz gerekir. Ancak, ne yaptığınızı gerçekten bildiğiniz zaman, STL'yi kullanan, göz kamaştırıcı derecede hızlı uygulamalar yapabilirsiniz . Ne yaptığınızı öğrenmek> kargoya küfür etmek, STL'yi reddetmek. Kimse STL'nin her zaman en iyi cevap olduğunu söylemedi. Demek istediğim, neden en iyi yol olmadığını bilmediğiniz takdirde STL'yi kullanmanız gerektiğidir.
Ed Ropple

11
Hiç kışkırtıcı olduğunu sanmıyorum - birisinin hafızasına sokacak şekilde ifade edildi, ancak bu son derece muhafazakar ve basit bir duruş. Kısacası: STL'yi geliştiren insanlar, bu soruyu sormaları gerektiğini söyleyenlerden daha bilgili ve daha donanımlıdırlar. Bir başkasına STL'nin uygun olup olmadığını sormanız gerekiyorsa, bir ev hazır çözümünü uygun bir şekilde hazırlamak için etki alanına özgü bilgiden neredeyse kesinlikle yoksun olursunuz.
Ed Ropple,

4
“Platformun izin verdiği kadar pratikte hızlı olacak”. Bu kesin bir gerçektir, çünkü birçok derleyici satıcısı STL'yi yeniden yazmak için zahmete giremez, böylece gerçekten de belirli bir mimariden en iyi performansı elde edeceği için. STL, büyük O hariç performans özellikleriyle ilgili hiçbir garantiye sahip değildir, ancak derleyici satıcının yapmak istediği kadar verimli veya verimsiz olabilir.
Kaj

35

STL'yi oyunlarda kullanmamak için çok az neden gördüm.

Bellek ayırma sorunları için, birçok kişi bunu bilmez, ancak STL konteyner sınıflarınız için özel ayırıcılar yazabilirsiniz. Tahsisatçılar, temel olarak tahsislerin nasıl yapıldığını belirlemek için şablonlarınıza aktardığınız politika sınıflarıdır. Bunları kullanarak, genellikle tercih ettiğiniz platformda hangi bellek sorunlarının sorunlu olduğunu çözebilirsiniz.

Tabi ki, STL'yi kullanıyorsanız ve büyük, imleçsiz tiplere dizge haritaları gibi aptalca şeyler yapıyorsanız, o zaman elinizde daha büyük problemler vardır.


Aslında, büyük işaretçi olmayan türleri haritada kullanmak iyi bir durumdur çünkü stdlib haritaları, uygulamayı göstericileri ve bireysel olarak tahsis edilen öğeleri kullanmaya zorlayan yineleyicileri geçersiz kılmama gerekliliğine sahiptir. Oyunlar için en iyi çözüm, google::sparse_mapkendi oyununu kullanmak veya yazmaktır.
v.oddou

neden yoğun harita değil?
GameDeveloper

23

Varsayılan STL, özellikle bellek hizalama söz konusu olduğunda, oyunlarla kullanımını zorlaştıran çok sayıda soruna sahiptir.

EA STL gibi özelleştirilmiş bir model , oyunlar için özel olarak tasarlanmıştır ve size çok daha iyi bellek performansı ve konsol kullanılabilirliği sağlayabilir. 2016 yılında, BSH-3 maddesi uyarınca GitHub'ta bir depo ile açık kaynak oldu .


19
STL'nin bellek kullanımı ve oyunlarıyla ilgili sorunlar genellikle özel ayırıcı sınıflarla çözülebilir. Aslında, önceki işimde, "özel" vektör sınıfımız, std::vectorvarsayılan tahsisatçıyı aşan sadece ince bir ambalajlayıcıydı.
Blair Holloway,

1
@Blair Holloway: "Özel ayırıcılar sınıf tabanlı, örnek tabanlı değil. Ayırıcıların nesneleri tahsis etmenin yanı sıra onları tahsis etmeleri ve tahrip etmeleri de gerekiyor. Bu iki ayrı kavramın karışımını zorlar: tahsis ve inşaat. Bunlar sadece bunlardan birkaçı maalesef stl-allocators ile ilgili sorunlar. " EA STL, STD tahsisatçılarının kötü olmasının birkaç geçerli nedenini ortaya koyuyor. Bu sadece "onlar kaçınılabilir olsun ya da olmasın" değil.
Simon,

@Simon - STL'nin tahsis sisteminin kusursuz olduğunu iddia etmiyorum, çünkü değil. İşe yarayan bir çözüm bulmak uzun zaman aldı. Demek istediğim bazı durumlarda, tam o olduğunu çalışılabilir bir oyun dostu bir çözüm kullanarak STL ve özel allocators ile küçük bir iş almak mümkün.
Blair Holloway

@Simon - Ayrıntılı: STL hantal olsa da, çok iyi test edilmiş ve hatasız bir kod parçası; Eğer kullanabilirseniz, özel bir çözümde hata ayıklamak zorunda kalarak çalışma saatlerinden tasarruf edersiniz. Şu andaki işim STL'yi ev yapımı tahsisatçıların lehine bırakıyor ve bu kodun bir kısmını hata ayıklamak ve yeniden düzenlemek için zaman harcamak zorunda kaldım, çünkü STL ile aynı olgunluk düzeyinde değil.
Blair Holloway

1
@Simon: Buradaki partiye biraz geç kaldım, ama bununla ne kastettiğinize dair özel bir örnek verirseniz merak ediyorum. STL'nin etkili bir şekilde çözemeyecek kadar genel bir şekilde belirli bir sorunu çözmenin iyi bir örneği nedir?
Ağustos'ta

21

İşte burada Mike Acton (Dragon Spyro'nun Insomniac Oyunları Motor Direktörü, Cırcır ve Clank ve Direniş şöhreti) burada sorulduğunda bunu söylemek zorunda kaldı . Not dev oyunda kullanım ile ilgili olarak genel olarak hem STL hem de Boost hakkında bir soru soruldu.

STL / Boost, gamedev'e mi ait? Sadece bir kısmı varsa hangileri?

Burada iki farklı şey hakkında soru soruyorsun, değil mi? STL ve Boost, ayrı ayrı. Ama gerçekten, cevabım aynı: Her ikisinde de yanlış olan bir şey yok , ama kullanımlarını önermiyorum. Ya kullanımı için insanları teşvik sığdırmak yerine bir soruna çözüm bulma bir soruna çözüm. Çözüm her zaman eldeki veriler ve donanımın kısıtlamaları vb. İçin uygun olmalıdır. Hem STL hem de Boost “dünya” hakkında son derece dar bir görüşe sahiptir ve uygun kullanımları sınırlıdır. Gerçekten, onları caydırıyorum, çünkü programcıları hemen yanlış yöne doğru yönlendiriyorlar, sık sık ikisinden birine ihtiyacın olduğunu hissedersen, muhtemelen problemini anlamıyorsundur derim.

Profesyonel oyun geliştiricilerin çoğunun C'ye karşı C ++ 'dan daha çok çaba gösterdiğini de farkettim.


18
C'ye karşı daha fazla çaba gösterme konusunda hemfikirim. Oyun geliştiricilerin büyük çoğunluğu ve SDK yazarlarının çoğu C ++ kullanıyor. Aslında son büyük C kullanıcısı kimliğiydi ve Carmack bile şimdi C ++ 'a geçti ...
Goz

82
Bay Acton'un yorumu kabataslak görünüyor. Genel olarak, STL bu sorunlar için iyi bir seçimdir . STL yaklaşımı "yanlış" gibi görünecek şekilde bir şeyler yapmaya çalışıyorsanız, yaklaşımınızı yeniden değerlendirmek ve gerçekten akıllı bir şekilde yapıp yapmadığınızı görmek gerçekten iyi bir fikirdir. Benim tecrübeme göre, çoğu zaman değil, muhtemelen değilsiniz. (IMO, bir problemi araçlarınız bağlamında kuvvetlice anlayarak, araçlarınızı sıfırdan tekrarlamak için atmak yerine, bunları çözmek için oldukça
zekicedir

50
STL ile olan deneyimim neredeyse tam tersi. Verimli ve zaman kazandıran. Kendi şablon kütüphanenizi veya konteyner kütüphanenizi yuvarlama gereğini hissederseniz, sorun değil. Fakat STL'nin (veya bunun için artırma) kötü olduğunu iddia etmeyin. STL'yi ticari iPhone, Nintendo DS, Wii, PC, Mac ve Xbox oyunlarında yaygın olarak kullandım. Ne zaman bir başkasının "daha iyi" kütüphanesini kullanmaya zorlanırsam, onu eksik ve doggy buldum.
Brffle

5
Kullandığım diğer platformlarda olduğu gibi DS üzerinde de çalışıyor. Kullanıcı Arabirimi ve AI kodunun her tarafında STL kullandım. Oyun ds.ign.com/articles/832/832147p1.html oldu . Ben Vakfı 9. parçasıydı Amaze parçasıydı küçük bir stüdyo, çalışıyordu
BRaffle

7
Mike tamamen verilerle ilgilidir. Verilere bakmak, verileri dönüştürmek için en iyi yöntemi önerir. Geniş ölçekte uygulayın ve programlayın. Bu bağlamda eleştirisi çok anlamlı. STL (ve tasarım desenleri), bir çözüm bulmak için gereken verileri incelemek yerine, verilerle çalışan bir tane bulmak için hileler çantamızdaki çözümleri inceliyoruz. Mike için konuşmayı kastetmiyorum, ancak soruna bu şekilde yaklaşmanın bu yolun geriye doğru olduğunu ve potansiyel olarak verimsiz veya şişkin çözümlere yol açabileceğini önereceğine inanıyorum.
Dan Olson,

19

Kendinizi STL'de zaten var olan bir şeyi yeniden yazarken bulursanız, herhangi bir nedenle durdurun . STL'yi kullanın.

STL yıllarca süren analiz ve zaman boyunca optimize edilmiştir ve muhtemelen daha verimli bir şey yazamayacağınız güvenli bir bahis. Bu, daha basit bir çözümün mümkün olabileceği STL'yi kullanmanız gerektiği anlamına gelmez (yani, bilinen bir şey sayısına sahipseniz, bir stl :: listesini değil), ancak bir harita uygulamanızı yazıyorsanız ( temel veri yapısı, bir oyun dünya haritası değil), yanlış yapıyorsunuz.


7
map <> bir oyun bağlamında etkin olan herhangi bir hafıza ya da CPU için kullanmak istediğiniz şeydir. hash_map <> neredeyse her zaman daha iyi bir seçimdir, ancak hash_map performansı satıcıya göre büyük ölçüde farklılık gösterir. Konsol ya da özelliklere sahip bir oyun inşa ediyorsanız, ölçeklenebilir bir ağ oyunu STL kesinlikle amaçlarınız için çok yavaş ya da şişirilmiş olabilir.
Ben Zeigler

3
unordered_map <> şu anda yaygın bir şekilde bulunmaktadır ve mevcut TR1 taslağında son derece katı performans gereksinimleri vardır. (Bence aşırı belirtme noktasına göre - bu açık karmaşayı bile yasaklar ve genellikle daha yavaş olmasına rağmen, standart tarafından tamamen yasaklanması gerektiğini düşünmüyorum.)

5
STL, konteynerlerin yanı sıra algoritmalar da sunar. Bir algoritmanın stl sürümünü kullanmamak için hiçbir sebep yoktur. Örneğin, std::sortgenellikle altında kendiniz yapmak istemeyeceğiniz cayır cayır yanan hızlı ve karmaşık introsort kullanır.
deft_code

hakikat unordered_mapya C ++ 11'dir ya da artırma ya çok yavaş, ne istersen google :: sparse_map ya da kendin gibi açık adresli bir harita.
v.oddou

16

STL oyunlar için uygun mu? Kesinlikle. Oyunlar karmaşık yazılım parçalarıdır, STL karmaşıklığı yönetmeye yardımcı olan özellikler sunar, bu yüzden iyidir.

Platformunuz için uygun mu? Şart değil. Bir konsol için yazıyorsanız, bellek ve önbellek kullanımı konusunda çok dikkatli olmalısınız. STL bunu kolaylaştırmaz.

Çok sık sık "oyunları", "gömülü veya ısmarlama donanımda çalışan yüksek performanslı gerçek zamanlı oyunlar" için yanlış yaptığımızı düşünüyorum, ancak bir ayrım yapmak önemlidir. Sabit bir 60fps hızında tam ekranda çalışmaya çalışmayan bir Windows oyunu yazıyorsanız, standart kütüphanenin size sunduğu araçlardan kaçınmanız için hiçbir neden yoktur.


10

Bunun partiye çok geç kaldığını biliyorum, ama zaman değişiyor ve cevaplar burada kalıyor. C ++ 11, birçoğu C ++ ve standart kütüphanesinin performansını artıracak oldukça kapsamlı değişikliklere sahip. Görünüşe göre STL veya Boost kullanmayanlar, yeni standartlara uymamaya meyilli, evdeki çözümleri önemli gelişmelerden mahrum bırakma eğiliminde görünüyorlar, elbette bu her zaman böyle değil.

EA'da kısa bir süre dışında 90'lı yılların ortasından günümüze her projede STL kullandım. STL karşıtı tarafın kullanmamak için bazı marjinal sebepleri olduğunu düşünüyorum. Bunlar büyük ölçüde gitti. Özel tahsisatçılar bir çözümdür, rezerv kullanmak başka bir şeydir ve şeyleri değerine göre geçirmemek üçte birdir, ancak bunlar oldukça basittir ve herhangi bir programcı bunları bilmelidir. Daha önemlisi, algoritmaların kullanılması olsa da. Derleyici yazarlar bir for_each () 'nin ne yaptığını tam olarak bilir ve kodu optimize edebilir. Bu bir ev haddelenmiş döngü ile gerçekleşemez. Bir const nesnesinde for_each () daha iyidir. Microsoft for_each serileştirme dahil olmak üzere birçok şekilde optimize eder. Ayrıca parallel_for_each () olan AMP kütüphanesine sahiptir. Şansınız varsa, derleyici mühendisleriyle bunun hakkında konuşun. Konsol derleyicileri, kullanılanları optimize edeceklerdir. Bir parça tavuk ve yumurta problemi. Microsoft C ++ 11 ile çok ağır gidiyor ve bir sonraki XBox farklı olmayacak. PS4 hakkında hiçbir fikrim yok, henüz bir tanesini almadık.

Özel ayırıcılar, bellek sorununu ele almanın bir yoludur, ancak başka (genellikle göz ardı edilen) bir seçenek, yeni sınıf tabanlı ve sil komutunu kullanmaktır. Büyük performans artışları bu şekilde olabilir.

Boost ve STL'nin problem çözme konusunda dar bir görüşü olduğu fikri saf delilik. STL ve Boost'taki kaç şeyin özellik ve politikalarla özelleştirilebildiğine şaşırdım. Bir örnek olarak case bağımsız dize karşılaştırması arayın.

Uzun bağlantı süreleri ve kod ihlaline ilişkin olarak, yeni harici şablon bu konuda yardımcı olmalıdır. Genel olarak, uzun derleme sürelerinin aşırı bağlanma ve pch'in yanlış kullanılmasından kaynaklandığını görüyorum.

STL'yi evde kullanmanın en zorlayıcı nedeni, STL'de size yardımcı olabilecek milyonlarca insanın bulunmasıdır. Her zaman olduğu gibi, erken optimize etmeyin ve test edin, test edin, test edin.


ilginç fikirler; " sınıf tabanlı yeni kullan ve sil " ile ne demek istiyorsun ? Zaten öbek üzerinde bulunan nesneleri kullanarak süreci hızlandırmak mı istiyorsunuz?
johnbakers

9

Bu oyun geliştirmede sıcak bir konudur. Şahsen ben tavsiye etmem, belki yukarıda belirtilen EASTL hariç. Oyunlarda STL ile ilgili iki temel sorunum var (teknik olarak "C ++ Standart Kütüphanesi", çünkü STL artık isim değil). 1) Dinamik bellek ayırma, STL kullanıldığında oyunlarda çoğu zaman boşa harcar. 2) STL kullanımı oyun mimarisine bir dizi yapı yaklaşımı teşvik ederken, bir dizi yapı yaklaşımı çok daha fazla önbellek dostudur.


Başka bir yerde de belirtildiği gibi, konteyner sınıflarına özel tahsisatçıları sağlayabilirsin - eğer istersen bunlar serbest listeler kullanabilir (önceden tahsis edilmiş diziler). Yapı dizileri - dizilerin yapısı - yapmaya çalıştığınız şeye çok bağlıdır - hangisinin daha iyi olduğu konusunda kesin ve hızlı bir kural yoktur.
Skizz

Çözdüğünüz sorunu iyi anlamanızın önemli olduğu noktasını takdir ediyorum. Fakat saygılarımla, hala sonuçlarına katılmıyorum sanırım. Her sorunun, özel STL tahsis edicilere ifade edilemeyen kullanım kalıpları vardır, ancak düz bir diziyle uygulanan sabit bloklu bir tahsisatçı gibi özel bir kapta kolayca yararlanılabilir. Ve bir dizi homojen tipin üzerine sabit bir dönüşüm uygulamak, polimorfik tiplerin bir vektörünü yinelemekten ve sanal metotları çağırmaktan çok daha iyi önbellek tutarlılığı ile sonuçlanacaktır.
Terrance Cohen

5

Değişir. Proje ne kadar büyük, hangi platform (lar) ve zaman çizelgesi nedir?

Büyük bir projede, sınırlı kaynaklara sahip platformlarda, önemli bir zaman çizelgesi ve bütçeye sahipseniz, yarım milyon satırlık bir kod tabanına bakacak kaçınılmaz cehennemden kaçınarak kendinizi çok fazla beladan kurtarabilirsiniz. STL ile dolu, 30'un üzerinde bir kare hızını koruyamıyor, birkaç varlığa daha fazla sığacak kadar RAM yiyor ve yapımı 2 saat sürüyor.

Bununla birlikte, diğer durumlarda, uygun şekilde uygulandığında STL ve hatta Boost çok faydalı olabilir. Bir STL / Boost seçkisi kullanan başlıklar üzerinde çalıştım ve kod için mutlak bir hayaldi: daha az hata / sızıntı ve bakımı kolay kod daha fazla zaman kodlaması daha eğlenceli yeni özellikler demektir! Özellikle hobi projeleri için motivasyon departmanında büyük bir kazanç.

Performans için ne zaman işlem yapabileceğinizi öğrenin!


1
"Performans için ne zaman işlem yapabileceğinizi öğrenin". Evet. Bu cümle tek başına olduğu kadar iyi bir cevaptır. Oyununuzla neye ulaşmak için neye ihtiyacınız olduğunu belirleyin, arkadaşlarınıza danışın ve STL'nin oraya gitmenize yardımcı olup olmayacağına veya sizi engellemesine karar vermesini sağlayın. Yeni nesil grafikler ve oyundaki performans için çıtayı ayarlamak istemiyorsanız, STL muhtemelen size yardımcı olacaktır.
gkimsey

4

IMHO, STL'nin zaten iyi çalıştığı ve yapılan işler için optimize edildiği için uygun olduğunu söyleyebilirim. Ayrıca, bir oyun üzerinde çalışıyorsunuz, bu yüzden elinizde bulunan araçları kullanarak hayatınızı kolaylaştıracak ve kodunuzu hatalara daha az açık hale getireceksiniz.

Oyunun AI, kullanıcı deneyimi veya daha iyisi gibi başka bir şey üzerinde çalışırken, neden tekerleği yeniden icat etmeye zahmet ettin; test etme ve hata ayıklama?


2
Uygulamada, bir projenin sonuna doğru, performans kritik bir sorun olma eğilimindedir. STL kullanıyorsanız, optimizasyon için çok az fırsatınız vardır, çünkü özel uygulamalarınızı alır ve genel olarak çözer. Belirli durumları belirli bir şekilde (ve dinamik bellek ayırma olmadan) çözmek neredeyse her zaman daha yüksek performanstır.
Terrance Cohen,

2
Ancak dinamik bellek ayırma istemiyorsanız, STL kullanmamalısınız. Bu bir nevi mesele. Kendi kodunuz daha iyi olmayacak ve kesinlikle daha da kötü olabilirdi. Tasarım kararı STL kötüye kullanma Burada konu değil STL, onun yetenekleri veya perf özellikleridir. Sorunun yanlış bölümüne saldırıyorsun.
Ed Ropple

4

STL iyi anladığınız sürece oyunlarda kullanım için kesinlikle iyidir. Motorumuz onu oldukça kapsamlı kullanıyor ve bu hiç sorun olmamıştı. Tamamen farklı bir hikaye olabilecek konsol geliştirme konusunda hiçbir deneyimim yok, ancak tüm PC platformlarında (Windows / Mac / Linux) iyi destekleniyor.

En önemli şey, her bir konteyner türünün güçlü ve zayıf yönlerinin ne olduğunu anlamak ve yaptığınız iş için doğru konteynerin seçilmesidir.


4

Eski işverenim, sağlam bir özel konteyner sınıfları setini kullanmaktan STL'ye geçti. Derleme zamanları arttı ve hata ayıklama kolaylığı düştü. Sıfırdan başlamış olsaydık, STL (belki de daha iyi kullanıldı) muhtemelen mantıklı olurdu, ancak STL'ye geçerken çalışma, hızlı, hata ayıklama kodunu atmayı haklı çıkaracak hiçbir şey kazanmadığı açık değildi.

Kişisel projelerim için STL'nin uygun olup olmadığı projeye bağlı. Bazı Mike Acton tarzı veri odaklı, bellek ve önbellek erişimi için optimize edilmiş işler yapmaya çalışıyorsam, en azından kendi özel veri yapılarını yuvarlamayı düşüneceğim. Bazı algoritmaları veya oynanışı prototipliyorsam ve performans, ölçeklenebilirlik, hedef platform vb. İle ilgilenmiyorsam, otomatik olarak STL'yi yakalayacağım.


4

Bu konuda 2 sentim, STL'nin gayet iyi çalıştığı yönünde. PC için bir 3D oyun motoru geliştiriyorum (AAA kalitesi değil, ancak yeterince gelişmiş - kodlu varlık türleri, ertelenmiş oluşturucu, tümleşik Bullet fiziği) ve henüz kapların ana tıkanıklığı olduğunu görmedim. Yanlış 3D API kullanımı ve zayıf algoritmalar, her girdiğimde ve biraz daha fazla performans göstermeye çalıştığımda (profil oluşturma!) En iyi hedeflerdi.


3

STL kullanarak oyunlar yaptım ve hoşuma gitti ve iyi performans gösteriyor.


3

İyi soru! Daha belirgin bir soru, bir oyunun STL ve Boost ile karşılanamayacağı bazı genel gereklilikler nelerdir.

Tecrübelerime göre, konsol donanımının sınırlı bellek sınırlamaları, özel ayırıcınız ne kadar zekice olursa olsun, her tür dinamik boyutlu kabı kötü bir fikir haline getirir. Kasıtlı sınırları olmayan kaplar, programcıları, veri kümelerinin sınırlarını zorlamayan kodlar yazmaya teşvik eder. İzlemesi zor olan sayısız değişkene bağlı olarak, hafıza sınırlamalarınızı aşabilirsiniz. Modern oyunlarda bunun dengesizliğin temel nedenlerinden biri olduğuna dair bir fikrim var.

Ek olarak, şablonların aşırı kullanımı, büyük bir kod tabanında çok uzun derleme sürelerine yol açabilir ve artık bir ps3'teki yardımcı çekirdeğin önbelleğine sığmayacak şekilde çalıştırılabilir boyutunuzu şişirir.

Ancak, sadece PC geliştirme için STL ve Boost'un çok iyi olduğunu düşünüyorum. Genel durum çözümleri her zaman ideal olmamakla birlikte, genellikle yeterince iyidirler. Bir probleme ilk çözümünüz neredeyse hiç ideal değildir ve yeteri kadar iyi olana kadar yetersizlikleri iyileştirir veya değiştirirsiniz.


2

STL oyununuz için uygunsa, STL oyununuz için iyi bir seçimdir.

Geliştirme sırasında yapılan tüm teknoloji seçeneklerinde olduğu gibi, artıları ve eksileri tartmanız gerekir - kendi kütüphanemi yayınlamak bana STL'yi kullanmaktan daha faydalı bellek kullanımı, performansı ve üretkenlik sağlayacak mı? Muhtemelen; vectordaha fazla bellek kullanan, daha yavaş olan ve zaten var olana kıyasla işlevini sürdürmek için büyük miktarda bakım gerektiren bir uygulama oluşturmak çok kolaydır .

İnsanlar oyunlarında STL'yi kullanmaktan kaçınmamalıdır, çünkü diğer kişiler oyunlarda STL'yi kullanmaktan kaçınır; Tüm seçeneklerini tartıyorlarsa kullanmaktan kaçınmaları gerekirdi ve başka bir uygulamanın ürünlerinin kalitesini artıracağına gerçekten inanıyorlardı .


2
Yorumunuzun son bölümüne% 100 katılıyorum, ancak daha da ileri gideceğim: STL'nin neden iyi bir seçenek olmadığını kesin olarak gösterebiliyorsanız , STL'yi kullanmayın. Aksi takdirde, yap. Kargo kültü ("ah, oyun geliştiricileri" C ++! "Dan" ah, oyun geliştiricileri STL kullanmaz! "A kadar her şey) sağlıksızdır. Bununla birlikte, ikinci paragrafınızla ilgili bir sorunla karşı karşıya kalacağım: STL'yi yeniden düzenlemenin hala STL’li insanlardan daha iyi bir fikir oluşturacağına inanmak için yeterince saf olan kişilerin görülmesi pek olası değildir vector. Yapabileceğin zaman, artık ihtiyacın olduğunu düşünmüyorsun! :-)
Ed Ropple

2

Çoğu soruda olduğu gibi cevap hiçbir zaman "evet veya hayır", siyah veya beyaz değildir. STL bazı problemler için iyi bir seçimdir, bu problemlerde kullanmak iyi olmalı. İşe yaramaz olduğunu varsaymak bir hatadır, ancak her durumda kullanmanın uygun olduğunu varsaymak da bir hatadır.

Oyun geliştirmede STL kullanırken dikkat edilmesi gereken en önemli husus hafıza tahsisidir. STL'nin varsayılan tahsisçileri, oyun geliştirme için tercih edilen tahsis stratejilerine uygun görünmüyor. Elbette özel tahsis ediciler kullanılabilir, ancak STL'yi STL olmayan bir kod tabanına eklemek isteyip istemediğinizi düşünüyorsanız, bu bütün fikri daha az çekici hale getirir.

Buna ek olarak, kod tabanınız STL değilse, özel ayırıcıları doğru şekilde uygulamak için STL veya şablon kavramlarını bilen hiç kimseye sahip olamayabilirsiniz.


2

Bence bu tartışma şu şekilde özetlenebilir:

vasat yazılmış uygulamaya özgü kod <iyi yazılmış genel amaçlı kod <iyi yazılmış uygulamaya özel kod

Evde yetiştirilen çözümü kategori 3'e girecek olan herkes, kesinlikle kendi sorunlarına yönelik orijinal sorunun cevabını bilir. STL kategori 2'ye giriyor. Bu nedenle, " STL kullanmalı mıyım " sorusunu sorması gereken biri için cevap muhtemelen evet.


2

STL, bir bilgisayarda kullanım için uygundur, çünkü gelişmiş sanal bellek sistemi, dikkatli bellek tahsisine olan ihtiyacı biraz daha az önemli kılar (yine de çok dikkatli olmasına rağmen). Sınırlı veya hiç bellek belleği bulunmayan veya aşırı derecede önbellek maliyetlerinin düşük olduğu bir konsolda, muhtemelen tahmin edilebilir ve / veya sınırlı bellek ayırma kodları olan özel veri yapıları yazarken daha başarılı olursunuz. (Ve aynı zamanda bir PC oyun projesinde de aynı şeyi yapmakta kesinlikle yanlış gitmeyeceksiniz.)


1

Bu soru gerçekten büyük bir sorulmamış bir soru olduğunu düşünüyorum - kullanmalıyım X benim de Y ? Ve bunu gerçekten yanıtlamanın tek yolu, bunu kendin denemek. X’in harika çalıştığını söyleyen her kişi için, bunun korkunç olduğunu söyleyen birini bulacaksınız. Ve her ikisi de haklıdır - projeleri için.

Yazılımla ilgili en güzel şey, çoğu diğer disiplinin aksine, istediğiniz şekilde çalışmadığını tespit ederseniz, daha sonra her zaman bir şeyleri değiştirebilmenizdir. Daha sonra STL'nin bu projede sizin için çalışmadığını öğrendiniz mi? Çıkartın, yerine başka bir şey yerleştirin. Görevleri nesneler arasında paylaştırmayı sevmiyor musun? Elden Geçirme. Nesne kullanman hoşuna gitmedi mi? Bunları düz C yöntemleriyle değiştirin. Her şeyi yapıları ve yöntemleriyle saklamaktan hoşlanmıyor musunuz? Bunları C ++ nesnelerle değiştirin.


1
Haklıyken, yeniden yapılanma için çok büyük bir ceza olabilir; bu yüzden keyfi bir karar yerine bilinçli bir karar vermek uzun vadede zaman kazandıracak.
Alan,

1

Ben STL'ye hayır diyorum. Nedenim oldukça basit:

  1. Oyun yazmak için STL'ye ihtiyacınız yok. Büyük olanları bile değil.
  2. STL derleme sürenizi önemli ölçüde artırır.
  3. Büyük derleme zamanı, gelişiminiz üzerinde daha az yinelenmeye neden olur.

Yineleme sayısını en büyük öneme sahip tutarım, bu yüzden sadece STL'den ve yinelemeleri yavaşlatan başka herhangi bir geliştirme tekniğinden (bunun için yapmak için mimarlık yapmak veya derlenmesi gereken komut dosyası dilleri gibi) uzak duruyorum.

Pahalı tekrarlamalar, aslında çok az bir şeyle işleri halletmeye çalışan büyük geliştirme ekiplerine yol açar. Onu gördüm ve duydum ve suçlulardan biri şablon kütüphaneleri için derleme zamanları gibi görünüyor.


1
Derleme zamanları konusunda hemfikirim. Herhangi bir önemli derleme zamanı kayıp iş miktarını iki katına çıkarır ; Örneğin, derleme 5 dakika sürerse, her seferinde 10 dakika kahve içebilirsiniz. ;)
Ipsquiggle

Bu tartışmanın iki tarafını da görmeme rağmen, tartışmanızla kesinlikle aynı fikirdeyim, söylemeliyim. +1.
Mühendis
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.