Neden yeni nesneyi anında başlatmak yerine nesne havuzları oluşturmayı ve kullanmayı düşünmeliyim?


25

Bu model hakkında birkaç kez okudum (en iyi uygulamalar açısından):

Hafıza Ayırma : Yeni nesneyi anında başlatmak yerine, her zaman nesne havuzları oluşturmayı ve kullanmayı düşünün. Bellek parçalanmasının daha az olmasına ve çöp toplayıcının daha az çalışmasına yardımcı olacaktır.

Ancak, aslında ne anlama geldiğini bilmiyorum. Nasıl uygulayabilirim?

Örneğin, Unity yöntemini GameObjectkullanarak başlatabilir miyim Instantiate?

Instantiate(prefab, new Vector3(2.0F, 0, 0), Quaternion.identity);

Bu kullanım tavsiye edilmiyor mu? Başka ne anlama gelebilir?



Teşekkürler Hellium Verilen videoyu izlemedim (çok büyük) ama metin gerçekten anlamamda bana yardımcı oldu: "Örnekleme ve yok etme eylemi verimsiz ve projelerinizi yavaşlatabilir"
Muhammad Faizan Khan

1
Bu tavsiyenin yaygın olmasına rağmen, her oyun için mutlak bir gereklilik olmadığını unutmayın. Özellikle küçük / kısa bir masaüstü oyunu, sıkışma teslimi veya prototip yapıyorsanız, havuz oluşturmaya başlamalısınız. Suya dalma testlerimde Unity, bize verdiğimizden daha büyük kitlesel yumurtlamaya ve yıkıma bile yetiyor. ;) Ancak çöp toplanmasını istemediğiniz ve daha sonra toplandığında kekemelik yapmasını istemediğiniz uzun bir oyun yapıyorsanız veya herhangi bir performans etkisinin daha keskin hissedildiği mobil platformları hedefliyorsanız havuzlamayı düşünün.
DMGregory

Thanks @DMGregory Haklısın. Girişiniz her zaman değerlidir. Kodlamada ekstra çalışma gerektirdiğinden küçük oyunlarda nesne havuzu konusunda endişelenmemeliyiz.
Muhammad Faizan Khan

1
Bu çok yaygın bir kalıptır, ancak kuralına uyduğunuzdan emin olun: "Önce profil, sonra optimize et." Önemli olmayan şeyleri optimize etmek kolaydır.
Cort Ammon - Monica

Yanıtlar:


41

Aynı prefabrik birçok örneğini başlatmayı planlıyorsanız, kesinlikle nesne havuzu kullanmayı düşünmelisiniz. Unity'nin Anlık İşlevini çağırmak, yapabileceğiniz en fazla vergi yöntemi yönteminden biridir.

Nesne havuzu, prefabrikler kullanılmadan önce başlatılmasıdır. Bunlar başlatıldıktan hemen sonra devre dışı bırakılır ve yalnızca gerektiğinde yeniden etkinleştirilir. Bu, hafıza kullanımını artırırken, oyun sırasında CPU'yu hızlandırmanın önüne geçer.

Örneğin, şu anda çalışma zamanında yüzlerce merminin ortaya çıkmasını gerektiren bir mermi cehennemi oyunu üzerinde çalışıyorum. Başlangıçta nesne havuzu olmadan oyun yapmaya çalıştım ama bu bir felaket (2 fps'den az) oldu. Şimdi, oyun başlamadan önce 500 mermi topladım ve oyun şaşırtıcı derecede hızlı (200 fps) çalışıyor.

Nesne havuzunun kullanılamadığı durumlar vardır. Örneğin, oyuncu girişinin hangi prefabrikin üretildiğini belirlediği bir oyununuz varsa, normal Instantiate çağrısını kullanmaktan başka seçeneğiniz olmayabilir. Nesne havuzu yalnızca hangi nesnelere ihtiyaç duyulacağını önceden bildiğiniz zaman mümkündür.

Sebastian Lague'nin YouTube dersi, nesne havuzlaması hakkında bilgi edinmek için harika bir kaynak: https://youtu.be/LhqP3EghQ-Q


"Örnek alma ve yok etme eylemi yetersizdir ve projelerinizi yavaşlatabilir". Sebep bu? Bu, biraz daha kodlamamız gerektiği anlamına gelir (devre dışı bırakma özelliğini etkinleştirme veya tekrar mermi konumunu ayarlama gibi tekrar ateş edebilmemiz gibi)
Muhammed Faizan Han

12
Tekrarlanan örnekleme ve imha maliyetine önemli katkı sağlayan tahsisat ve çöp toplamadan bahsetmek faydalı olabilir. Yeterince çöp üretin ve sonunda tüm oyun çöp toplayıcısının hepsini süpürmesini beklemek zorunda. ;)
DMGregory

3
@ corsiKa bu 80'lerin dönemi optimizasyonu olurdu. Birlik, söz konusu prefabrileri devre dışı bırakarak sistemlerini görmezden gelebilir.
congusbongus

2
“Örneğin, oyuncu girişinin hangi prefabrik üretileceğini belirlediği bir oyununuz varsa, normal Anlık Arama'yı kullanmaktan başka seçeneğiniz olmayabilir.” - Pek sayılmaz. Başlangıçta (veya sahne yükünde) istenen boyutlara tahsis edilen farklı prefabrikler için kolayca birden fazla nesne havuzuna sahip olabilirsiniz. Veya, eğer biri yapmak isterse, birden çok prefabrik tipte depolayan bir nesne havuzu da işe yarayabilir.
Ethan Bierlein

1
@DMGregory Tipik bir GC ortamında, tahsisatın maliyeti en fazladır; Tipik bir GC olmayan bir ortamda tahsis, maliyetin büyük kısmıdır. Nesne havuzlaması her ikisi için de harikadır, çoğunlukla aynı madalyonun sadece iki yüzüdür. Aşırı durumda, eski oyunlar oyundan çıkarken "tahsis edilen" tüm nesnelerle yazılmıştı - oyun çalışırken çok az hafıza vardı ya da hafıza ayırmıyordu. Bir şekilde "toplanmamış" bir şey kullanmadın. Birlik birçok gerçek zamanlı "meta veri" kullandığından, havuzlama biraz yardımcı olabilir - ancak uygulanması daha zordur.
Luaan
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.