Varlıklar için neden özel bellek yönetimi gerekiyor?


10

Oyun programlamayla ilgili hemen hemen tüm kaynaklar, özellikle 3D açık dünya oyunları, disk, sistem belleği ve video belleğine sürekli olarak varlıkların boşaltılması ve yeniden yüklenmesi gerektiği hakkında konuşur. Konsollarda bunu anlayabilirim, çünkü herhangi bir potansiyel taşma ile baş edemeyen çok basit bir bellek yönetimi şemaları var.

Ancak, PC'de durum çok farklı. İşletim sistemi tarafından sistem belleği için sağlanan sanal bellek vardır ve grafik sürücüsü CPU'dan GPU'ya ileri geri geçiş yapar. Öyleyse neden her şeyi bir kerede yüklemek yeterli değil ve sadece önceden getirme ile uğraşmak ve muhtemelen gerekli bir varlık takas edilirken engelleme olmadığından emin olmak zorunda?


Bu, her şeyin naif bir şey kullanılarak naif olarak tahsis edildiği anlamına gelmez malloc. Her şey bitişik ve önbellek uyumlu olacak. Yine de elle giriş ve çıkış yapma konusunda endişelenmenize gerek yoksa, bellek erişiminizi verimli hale getirmek muhtemelen daha kolaydır ...


GÜNCELLEME:

Eşzamansız arabellek aktarımlarına bir miktar okuduktan sonra , grafik sürücüsünün belleği otomatik olarak girip çıkarabilme biçiminin yetersiz olduğu fikrini alıyorum. Bu CPU kaynakları için de geçerli midir; yani, belirli bir kaynağın sanal bellek varlığında bile ne zaman yüklenip boşaltılacağını her zaman manuel olarak yönetmek daha mı iyidir?


1
Varlık içeriğinin sistem belleğinde saklandığını varsayıyorsunuz. Varlık verilerinizin çoğu GPU belleğinde saklanır ve bu da çok daha sınırlıdır.
dadoo Games

Buradaki cevabı okuduktan sonra OpenGL sürücülerinin tüm arabellekleri / dokuları otomatik olarak CPU üzerinde tuttuğu fikrini alıyorum. Ancak, eşzamansız yüklemelerden yararlanmak için bu aktarımları manuel olarak belirtmenin neden yararlı olabileceğini görebiliyorum .
jmegaffin

Bunun oyun projenizle alakalı olduğundan emin misiniz? Teknik zorluğu gördüğümden emin değilim, sadece çözümü. Teknik bir zorlukla karşılaşmıyorsanız, bir çözümü uyarlamak ya da anlamak zor olabilir.
AturSams

Oyun motorlarının, sistem / sürücüler zaten çalışırken sanal bellek sistemlerine sahipken neden karmaşık varlık önbellek sistemleri uyguladığını merak ediyorum. Bu benim için önemli çünkü bu bilgilerin çok önemli olduğu açık dünya bir oyun yazıyorum.
jmegaffin

Oyununuz performans sorunları yaşıyor mu ve profil oluşturma aracı bunun bellek erişimi nedeniyle olduğunu gösteriyor mu? Açık seviyeler içeren oyunlarla ilgili sorun, teknik açıdan bunun çok fazla veriye dönüşmesidir. Bu veriler üzerinde ne kadar fazla kontrole sahip olursanız performans o kadar iyi olur. Verileri yönetmek için neden en verimli sistemi uygulamıyorsunuz? Oyun geliştirme çok rekabetçi ve uzmanlar için paranız olduğunda, daha fazla ayrıntı ve daha yüksek fps sıkmak isteyen, herhangi bir taş sarılmadan bırakmayacaksınız.
AturSams

Yanıtlar:


16

Modern açık dünya oyunları hafızaya sığmaz. 32 bit işletim sistemine sahip oyuncuların sayısı nedeniyle çoğu oyunun hala 32 bit olduğunu ve en iyi 32 bit işlemin aynı anda yalnızca 4 GB adresli belleğe sahip olabileceğini (sanal bellekten bağımsız olarak) unutmayın. 2-3 GB ile sınırlıdır. Parçalanmadaki atma ve bir seferde bir bellekte kullanabileceğiniz kullanılabilir nesnelerin gerçek miktarı, geniş bir ortam için ihtiyacınız olan toplam verilerden oldukça küçüktür. 64 bit işletim sistemlerinde bile, maksimum son kullanıcı uyumluluğu sağlamak için genellikle yalnızca 4 GB belleğe sahip düşük özellikli makineleri hedeflemeniz gerekir. Mobil cihazları, WiiU gibi "düşük güçlü" donanımları, vb. Unutmayalım. Geliştiriciler, büyük süslü oyun PC donanımlarından çok daha fazlasını hedeflemek zorunda.

Sanal bellek bir çözüm değildir, ilk olarak adres alanı sınırlamalarını reddetmediği ve aynı zamanda optimal olmadığı için. İşletim sistemi, uygun olmayan zamanlarda veya uygunsuz yollarla sayfa yayınlayabilir. Bu, hazırda bekletme modu ilk kez ortaya çıktığında işletim sistemleri tarafından ele alınan bir sorundu; işlemleri diske ve daha sonra geri çağrı bazı durumlarda uygulama açıkça kaynağı geri akış daha önemli daha yavaş oldu. Bugün hala bir sistem belleği tükendiğinde, sayfalar için disk belleği sorunları görebilirsiniz ve sistem yanıt vermiyor WM / explorer.exe disk belleği dışarı çalıştırmak için gerekli kritik şeyler olur. Sanal bellek, sistemlerin çok az RAM'e sahip olduğu ve bellek ve disk hızları arasındaki boşluğun çok daha küçük olduğu yıllar önce ortaya çıkan bir soruna yönelik bir çözümdü. Bugün bile' En hızlı SSD'ler ucuz / yavaş RAM hızının küçük bir kısmıdır ve diskinizi sanal RAM olarak kullanabileceğinizi iddia etmeye çalışmak artık en iyi fikir değildir. Bu, bazı insanların tersini yaptığı ve dosya sistemlerini RAM disklerine yüklediği bir çağdır; sanal belleğin oluşturulmasına yol açan kısıtlamalar artık geçerli değil.

Disk sorununun yanı sıra, özel kaynak yönetimi hala oyun geliştirmenin büyük bir parçasıdır. Hata ayıklama kancalarından parçalanma kaygılarına, karmaşık kaynakların akıllı akışına kadar, tüm dünyayı basitçe sonsuz bir bit kutusu gibi davranmak gerçekçi değildir.


Detaylı cevap için teşekkürler. Her ne kadar hala GPU sürücülerinin sanal belleği (VRAM ve sistem RAM'i arasında) işleme biçimi hakkında bazı bilgiler arıyorum.
jmegaffin

@Boreal: aynı konular. "RAM" i "VRAM" ve "disk" yerine "CPU bellek" ile değiştirin
Sean Middleditch

@SeanMiddleditch +1 Güzel bir cevap, "Bu, bazı kişilerin tersini yaptığı ve dosya sistemlerini RAM disklerine yüklediği bir çağdır", bellek eşlemeli dosyaları mı kastediyorsunuz? Ayrıca cevabınızdan anladığım şey, özel bellek ayırıcısının işletim sisteminin belleği ayırmasını engellemesidir, bu, örneğin brk () kullanarak çekirdekten bellek istediğiniz kadar bellek çağrılacağı için değil mi? PC'de sayfalama tam olarak özel bir bellek ayırıcı kullanılarak engellenir mi?
concept3d

1
@ concept3d: bellek eşleme değil, gerçek RAM diskler. Disk tarafından değil, bellek tarafından desteklenen bir sürücü yapabilirsiniz. Özel bellek yöneticisi sayfalamayı engellemez (başka bir uygulama tüm belleği tüketiyor olabilir). Kaynakları akıllıca yönetmek (nesne / kaynak yönetimi katmanında), artık ihtiyacınız olmayan nesneler için belleği boşaltmanız anlamına gelir. İşletim Sisteminin bellekte tuttuğu disk önbelleklerini düşünün
Sean Middleditch

6

32 bitlik bir oyun için, çoğu oyun çeşitli nedenlerle olduğu için, tek taraflı bir DVD'de (4.3 GB) gelen bir oyun bile, 32 bitlik bir adres alanına takılabilecek çok daha fazla içeriğe sahiptir. Ve bu, içeriğin disk üzerinde sıkıştırılmadığını ve mükemmel bir şekilde optimal olan her şeyi bir anda bitişik adres alanı yaklaşımına yüklediğini varsayar. Birçok oyun artık 10GB'lık içeriği kolayca aşan birden fazla DVD'de geliyor. Bilgisayardaki deneyimime göre, adres alanınız 2 GB'a yaklaştığında tahsisler başarısız olmaya başlayacak ve kullanıcının ne kadar fiziksel belleğe sahip olduğuna bakılmaksızın bu zor bir sınır haline gelecektir.

64-bit'e atlarsanız, motorunuzun desteklediği varsayılarak, bu sabit sınırın ortadan kalktığı varsayılırsa, sadece etkili bir yumuşak sınırla değiştirilir - sanal bellek değişimi başlar başlamaz, oyunun performansı düşecektir kabul edilemez. Ana işlem belleğin tekrar geri çağrılmasını beklemek zorunda kalırsa, kare hızı kesilir ve aksar. Sanal bellek bunu şeffaflaştırabilir, ancak performans göstermez. Bu belleği diskten geri almak fiziksel olarak zaman alır ve beklerken oyununuz durdu. Etrafında çalışmak mümkün olsa da (yakında ihtiyacınız olacağını bildiğiniz bellek sayfalarının arka plan önceden getirilmesiyle), bu zor ve güvenilir olmayan bir işlemdir ve yine de performans sonuçları olacaktır.

İşletim Sisteminin hangi sayfaların diske değiştirileceğine karar verme algoritmaları, oyununuz ve bundan sonra neye ihtiyaç duyacağı hakkında hiçbir bilgiye sahip değildir. Ayrıca, işletim sisteminin hala oyununuzla aynı anda çalışan diğer uygulamaları ve işletim sisteminin kendisini desteklemesi gerekir. Sayfalar diskten döndürülürken durmak zorunda kalmak muazzam bir performans isabetidir ve oyununuz, başka bir uygulama veya buna neden olan işletim sistemi olup olmadığı önemli değildir, oyunun performansı büyük ölçüde acı çekecektir.

Bellek sınırının yumuşak veya sert olmasına bakılmaksızın, bellek hala sınırlıdır. Ancak, performans sınırına ulaşmadan her şeyi bir kerede yükleyebilseniz bile, hala istememek için nedenler var:

  1. Oyunun yüklenmesi ve interaktif bir duruma gelmesi çok daha uzun sürüyor çünkü başlangıçta her şeyi yüklüyor ve saklıyor. Bir sabit diskten yaklaşık 150MB / sn ve hatta en hızlı DVD sürücüsü (24x) 33MB / sn'de yüklenebilir. Bu, örnek 4.3GB DVD değerindeki içeriğin HDD'den yüklenmesi en az 30 saniye ve DVD'den yüklenmesi 133 saniyeden fazla süreceği anlamına gelir. Bunlar kabul edilemeyecek kadar uzun yükleme süreleridir.

  2. Oyununuz haklı olmaktan çok daha fazla hafıza alır. İçeriğin yalnızca% 10'u herhangi bir anda görünürse, geri kalan kişiyi tutmak sadece israftır ve kullanıcının bu belleği başka bir şey için kullanmasını önler. Kullanıcılar genellikle düzgün çalışması için orantısız olarak büyük miktarda bellek gerektiren oyunları affetmezler.

Bir yükleme ekranı sırasında arka planda veya senkronize olarak diskten dinamik olarak veri akışı, bellek kullanımınızda çok daha verimli olmanızı, ihmal edilebilir bir çaba ve kullanıcı için sadece küçük bir dezavantaj sağlar. Ancak bu bir optimizasyon ve diğer optimizasyonlarda olduğu gibi azalan getirilere sahipse onu uygulamaya çalıştıkça. Bir noktada, bir şeyi yerleşik tutmak için bellek ayak izindeki artış, yüklemeye gerek kalmadan orada bulunmasının sağladığı avantajlardan daha ağır basmaktadır. Ancak bu noktaya ulaşılana kadar, sadece ihtiyacınız olanı, ihtiyacınız olduğunda yüklemek daha iyidir.


1

Sadece genel ve basit bir şekilde konuşarak ve sanal bellek uygulamalarının ayrıntılarını göz önünde bulundurmadan, geliştirici her zaman VM uygulamasının eksik olduğu öngörü bilgisine sahiptir.

Geliştirici her zaman "Bu ses dosyasını şu anda yüklememe gerek yok. İçindeki müzik sadece ekran üzerinden oyun için kullanılıyor" diyebilir . Ve oyun bittikten hemen sonra geliştirici, "Bu ses klibine artık fiziksel bellekte ihtiyacım yok. Sadece ekran üzerinden bu oyun için kullanılıyor." Diyebilir .

İşletim sisteminin böyle bir öngörüsü yoktur. Pek çok sayfa arızasının daha sonra, kısa bir süre içinde erişilemediğinden, fiziksel bellekte bazı ses kliplerine artık ihtiyaç olmadığını anlayabilir. Ancak öngörüyi arkaya dönüştürmek, bir çok sayfa hatasına ve bir çok sayfa hatası, bir yazılımdaki video oyunu kadar zaman açısından kritik öneme sahip kare hızlarında hıçkırık anlamına gelir. Bu tür hıçkırıklardan kaçınmak istiyorsanız geliştiricinin öngörüleri gerçekten yardımcı olur.

Bu, donanım ve yazılımdan bağımsız olarak kavramsal olarak geçerlidir. Bellekte sayfalamanın pahalı olduğunu varsayarsak, geliştiricinin öngörüsü bu masrafı azaltmaya her zaman yardımcı olacaktır.

Daha da geniş anlamda konuşursak, donanım tasarımcısı, derleyici tasarımcısı, işletim sistemi / sürücü tasarımcısı ve uygulama geliştiricisi arasında hiç bitmeyen bir döngü var. Donanım / derleyici / OS / sürücü geliştiricileri genellikle ortalama uygulamanızı her zamanki bellek erişim modellerine göre hızlandırmak için optimizasyonlar yapmaya çalışırlar ve belki de bazen "İnsanlar istedikleri gibi kod yazabilmelidir ve hızlı olmalı. "Ancak, bu tür bir düşünce varsa, genellikle performans açısından kritik alanlar için başarısız olur, çünkü performans açısından kritik geliştiriciler derleyicilerinin, donanımlarının, işletim sisteminin, sürücülerinin vb. Karmaşık ayrıntılarını öğrenmeye başlar ve özellikle kod yazmaya başlar mümkün olan en hızlı kodu yazmak için mümkün olduğunca tasarlanmış (önbellekler, sıcak / soğuk alan ayırma, önbellek dostu kod için SoAs, vb.). Ve bu hiç bitmeyen bir oyun gibi. Bunlar, performans açısından kritik alanlarda asla kara kutu olarak değerlendirilmez, çünkü geliştiriciler performans için rekabet ederler.

Şahsen, sanal belleğin varolmamasını isterdim, çünkü işler aşırı derecede güneye gittiğinde çok aşırı bir performans cezası gibi çok fazla ve çok fazla performans eğilimi gösteren ek bir performans öngörüsü ekler.. Bazen, bazı giriş alanlarına sarhoşken kazara fazladan bir veya iki rakam yazdığım bazı uygulamaları kullandığım durumlarda, işletim sistemini yapamayacağım bir taramaya getirecek şekilde fiziksel belleği çok hızlı tüketmesine neden oldum. t Hatta ilerleme çubuğundaki iptal düğmesine tıklayın ve bir işlemi öldürmek için Ctrl + Alt + Del tuşlarına basarken 10 dakika beklemek zorunda kaldım ve bir şeyleri tekrar kullanılabilir hale getirmek için içkimi dökerken kendime küfretti ve bu sayfa dosyasının bir SSD'de depolanmasına rağmen. Bu durumlarda, "bellek yetersiz" hatası veya başka bir şey tercih ederdim, bu noktada bazı 17 bellek porno sekmemden bazılarını kapatabilirim (tamam, yine de favorilerime yer işareti koydum) ve sonra hemen devam edin işime devam ediyorum.

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.