Bir 2D oyunda büyük video belleği gereksinimlerini nasıl çözeriz?
Allegro C / C ++'da 2D oyun (Factorio) geliştiriyoruz ve oyun içeriği arttıkça video belleği gereksinimlerinde bir sorunla karşı karşıyayız.
Halihazırda ilk önce kullanılacak görüntüler hakkında tüm bilgileri topluyoruz, bu görüntüleri mümkün olduğunca kırpıyoruz ve mümkün olduğu kadar sıkı şekilde büyük atlaslarda düzenliyoruz. Bu atlaslar, büyüklüğü sistem sınırlamalarına bağlı olan video belleğinde saklanır; şu anda 8192x8192'ye kadar genellikle 2 görüntü olduğundan, 256Mb ila 512Mb video belleği gerektirir.
Bu sistem bizim için oldukça iyi çalışıyor, bazı özel optimizasyonlarda ve oluşturma ve güncelleme iş parçacığını böldüğümüzde, ekranda 60 fps'de on binlerce görüntü çizebiliyoruz; Ekranda birçok nesnemiz var ve büyük bir yakınlaştırmaya izin vermek kritik bir gereklilik. Daha fazla eklemek istediğimiz gibi, video belleği gereklilikleri ile ilgili bir sorun olacaktır, bu nedenle bu sistem muhtemelen tutamaz.
Denemek istediğimiz şeylerden biri, en yaygın imgeleri olan bir atlası ve ikincisini önbellek olarak kullanmak. Görüntüler isteğe bağlı olarak oraya bellek bitmapinden taşınacaktı. Bu yaklaşımla ilgili iki sorun var:
- Hafıza bitmapinden video bitmap'e çizim allegro'da acı verici bir şekilde yavaş.
- Video bitmap ile ana iş parçacığından başka, allegro içinde çalışmak mümkün değildir, bu yüzden pratik olarak kullanılamaz.
İşte sahip olduğumuz bazı ek şartlar:
- Oyun belirleyici olmalı, bu nedenle performans sorunları / yükleme süreleri oyun durumunu asla değiştiremez.
- Oyun gerçek zamanlı ve yakında çok oyunculu olacak. Her ne pahasına olursa olsun en küçük kekemelerden bile kaçınmamız gerekir.
- Oyunun çoğu sürekli bir açık dünya.
Test, her konfigürasyon için birkaç kez 1x1 ila 300x300 arasındaki boyutlar için bir partide 10000 sprite çekilmesinden ibaretti. Nvidia Geforce GTX 760 üzerinde testler yaptım.
- Video bitmap ile video bitmap çizimi, kaynak bitmap bireysel bitmapler (atlas varyantı) arasında değişmediğinde sprite başına 0.1us aldı; boyut önemli değildi
- Video bitmap video bitmap çizimine, kaynak bitmap çizimler arasında geçiş yaparken (atlas olmayan değişken) sprite başına 0.56us aldı; Boyut da önemli değildi.
- Video bitmap çizimine yönelik bellek bitmap'i gerçekten şüpheliydi. 1x1'den 200x200'e kadar olan boyutlar bitmap başına 0.3us aldı, bu yüzden çok yavaş değil. Daha büyük boyutlar için, zaman çok çarpıcı bir şekilde artmaya başladı, 9x'de 201x201 için 31us için 311US.
Atlas kullanmak, performansı 5'ten daha büyük bir faktörle artırır. Oluşturma için 10ms'm varsa, atlas ile çerçevede 100 000 spitter ile sınırsızım ve onsuz 20.000 sprit sınırındayım. Bu sorunlu olurdu.
Ayrıca gölgeler için bitmap sıkıştırmasını ve 1bpp bitmap formatını test etmenin bir yolunu bulmaya çalışıyordum, ancak bunu allegro'da yapmanın bir yolunu bulamadım.