2011-05-28 10 views
11

Oyunumda java + AndEngine kullanıyorum. ben bazı donuyor var Oyun sırasında AndEngine oyununun optimizasyonu

i bilgi araştıran ve bulunan oyun performansını optimize etme bazı adımlar:

  1. kaçının GC (Çöp toplayıcı) oyununda ana eylem denilen olmak:
    a) Oyun oynarken nesne oluşturmayın;
    b) gereksiz nesneler oluşturmayın; tekrarlar
  2. Optimize kod çok sık

Bu adımları takip etti, ama daha az i oyun sırasında bazı donuyor asla.

Artık oyun başlamadan önce tüm dokuları oluşturup yüklüyorum ve onları boşaltmayın, bu kötü bir fikir mi? Oyun sürecini nasıl optimize edebilirim? Belki de ana etkinlikten önce olası tüm belleği boşaltmalı ve sonra her seviye sonra bunları yeniden yüklemeliyim?

+2

Sprite ne dersiniz? –

+0

hmm .. gerçekten, onları şimdi silme, oyun aktivitesi önce tüm unufsız stuf boşaltmak zorunda olduğunu düşünüyorum – dilix

cevap

16
  1. doku boyutlarını azaltın Nesne Pool kullanma.
  2. Kullanım düşük kaliteli dokular (RGBA4444 veya yerine RGBA8888 ait RGB565) (doku mümkün olduğunca az olarak değiştirilmesi gerekir, böylece spritesheets kullanmayı deneyin aka)
  3. doku anahtarları azaltın ..
  4. Çağrı setIgnoreUpdate nerede varlık güncellemelere ihtiyaç duymaz.
  5. Use SpriteBatches if possible.Bilginize

: özel Gölgelendiricilere ve varlıkları ile performansını artırmak için bir çok daha fazla imkana sahip böylece AndEngine sonraki sürümü spor GLES2 (orta Aralık geliyor). Ayrıca, UI-Thread'de (doğrudan onCreate'da) engellemek yerine, GL-Thread'in ilk karesindeki başlangıç ​​boru hattını (onLoadEngine/onLoadResources/onLoadScene/onLoadComplete) de yürütecektir.

Ayrıca, boru hattının aşamalarını boru hattını bir bütün olarak kırmadan, Threads içine kolayca boşaltmanızı sağlar. Boru hattının aşamaları yürütülürken bir ProgressDialog belirten BaseGameActivity alt sınıfını uygulamak çok basit olacaktır. Varlıklar sahneye eklendiklerinde açılır. Genel olarak bu, gerçek yükleme zamanlarının azaldığı ve daha da önemlisi keçe yükleme zamanlarının önemli ölçüde azaldığı anlamına gelir! Bir yükleme ekranı oluşturmak, daha önce olduğu acıya karşı oldukça kolaydır.

+4

Gönderide atıfta bulunularak, burada Aralık ayından itibaren GLES2 sürümü hakkında bilgi verilmektedir: http://www.andengine.org/forums/announces/andengine-gles2-pre-release-on-december-23rd-t6097.html –

+0

Herhangi TMX haritalarını görüntülemenin şansı nedir? TMXLayer.draw() her bir döşemeyi ayrı ayrı çizer. Birden çok TMX döşemeyi tek köşe tampona yerleştirme ve hepsini bir kerede çekme şansı var mı? – Yar

4

Kullandığım yaklaşım, seviye başlamadan önce tüm gerekli dokuları yüklemektir. Bir sonraki seviyeye gittiğinizde, sadece bir sonraki seviyede gerekmeyen nesnelerin dokularını boşaltmanız gerekir. Diğerleri, skor tahtası veya ana arkaplan gibi yüklenmemelidir. Ve elbette, tüm dokularınızı etkinliğinizdeki boşta bırakmanız gerekir. Doğru, ilk önce döngü kodunu optimize etmelisiniz, örneğin, bir döngü sırasında herhangi bir kaynağa erişmemelisiniz, bir döngü başlatmadan önce hepsini getirmeyi deneyin.

7

Oyununuz hakkında daha ayrıntılı bilgiler göndermeniz gerekecek, ancak bir öneri sprite ve nesneleri yeniden kullandığınızdan emin olmaktır. Örneğin, oyununuzun tekrarlanan bir nesne türü varsa (rastgele uçan düşmanlar, mermiler, tekrarlı arka plan öğeleri), ekranda bir defada ihtiyacınız olacak maksimum miktarda nesne üzerinde düşünmeye çalışın ve sonra o kadar çok oluşturun. Oyun başlamadan önce, ihtiyaç duyduğunuz şekilde onları yükleyip sıfırlayabilirsiniz. Örneğin, oyunum ekranın üstünden "rastgele" uçan düşmanları kullanıyor. İlk başta her bir görüşmeyle yeni bir düşmandım, ama şimdi toplamda sadece 6 düşman içeren bir ArrayList'im var. Bu, özellikle uzun oyun oturumlarında, BÜYÜK bir performans artışıyla sonuçlandı. Bu, GC optimizasyonuyla ilgilidir, ancak daha önce optimize etmeyeceğiniz bir şey olabilir.

+5

Nesnelerin yeniden kullanımı genellikle _Object pooling_ olarak adlandırılır. Bir nesne havuzu kullanmak GC'nin çalışmasını engeller. – Eloff

5

Öncelikli optimizasyon yapmadan önce kodunuzu profillemenin önemi abartılamaz. Eğer GPU bağlıysanız (bu olası değil ama GLES2.0 ve programlanabilir boru hattını kullandığınız gibi) ve GLSL kodunu nasıl yazdığınızı bilmediğimiz için tüm spriteları optimize etmenin pek bir anlamı yoktur.).

Profilleme için kullanabileceğiniz farklı şeyler olduğundan, profil oluşturmak için kullanabileceğiniz birkaç araç vardır.

Bellek profili oluşturmada, bellek ayırmayı kontrol etmek için DDMS'yi ve izleme görünümünü ve belirli bir süre boyunca GC'nin ne sıklıkla çağrıldığını kullanabilirsiniz. Bu SO soru detaylara sahip:

How can I profile my Android app?

oft çalışma koduna ilgili olarak, size zaman yapabilirsinizEND_SPAN kendiniz ve günlük dosyasına dışarı sonuçları yazın. Biraz emek yoğun, ama muhtemelen kendi kodunuzun potansiyel olarak yavaş olduğunu biliyorsunuzdur.

+1

İyi bir nokta, sanırım hiç kimsenin bunu önerme zahmetine girmeyecek kadar açık bir tavsiyesi var :-) Ayrıca, soru tarihi göz önünde bulundurulduğunda, OP, o zamanlar hala geliştirme aşamasında olduğu için GLES2 kullanmıyordu. – JohnEye

0

Bu, oyun performansınızı kesinlikle artıracaktır: varsayılan temayı her zaman oluşturmaya devam ettirme. İşte bir tutorialhttp: //www.andengine.org/forums/tutorials/andengine-performance-tip-of-the-day-t810.html