2011-02-02 15 views
9

Oyunumu lunarlander örneğinden alıyorum ve bunu yapmaya başladığımdan beri kekemelik sorunları yaşıyorum. Ben denedim hiçbir şey onlardan kurtulmak bu yüzden ben birkaç ay geçirdim nerede ayçiçeği örnek soyulmuş bir sürümünü oluşturmak ve kekemeliğini göstermek için basit bir kaydırma görüntü koymak için var. NOT: çöp toplayıcı ile ilgili değildir. Bunun olduğunu düşünüyorsanız, sadece günlüğüne bakın, çöp toplayıcı, kekeliğin ortaya çıktığı kadar yakın olmayan bir yerde çalışır.Garip kekememe sorunları (tam kaynak dahil)

Ekranı aşağı kaydırılan görüntü, telefonumda saniyenin yaklaşık 1/10'u için yaklaşık her saniye yanar (Motorola Milestone, 2.2). Bu tür kekeleme, tamamen oyun oynamayı tamamen ortadan kaldırmaz, ancak çok rahatsız edici ve sinir bozucu olur. Oyunum ayrıca hızlı kaydırma ve hızlı hareketlerin birçoğunu içeriyor. Bu yüzden genellikle orada daha açık. eğer Eğer herhangi Eğer bu tutulma projesinde hızlıca bir göz atın ve görebiliyordu zaman varsa

:

  1. Bu telefonunuzda sizin için teklediği (yakından kayar gibi görünmeye, bu küçük bir aksaklık vardır ikinci ikinci bir buçuk her yarım)
  2. Eğer ben sadece beni farkında olmadan bütün bunları neden olan bir kod engelli hattına sahip umuyorum kekeleme

düzeltmek için herhangi bir şekilde görebiliyorsanız. Ben sadece bu sıyrılmadan sonra bile, 1000 nesne ile tam oyun olarak aynı miktarda kekemeye sahip olduğuna inanamıyorum, özellikle de telefonumda tam 60fps hızında çalıştığı için.

DÜZENLEME: Traceview oyununda oyunumu hazırladım, iyi görünüyor.

Kaynak indirme linki: En kaydırma sık alınması gerektiğini çöp sürü oluşturur gibi http://dl.dropbox.com/u/4972001/LunarLander.rar

+2

Eğer traceview ile oyununuzu profilleme denedin mi (... Eğer gerçekten OpenGL ES kullanarak olmalıdır uçmak istiyorum Elbette)? http://developer.android.com/guide/developing/tools/traceview.html – bigstones

+1

Evet, iyi görünüyordu - her "updatePhysics" araması arasında bile boşluklar vardı ve arama yapmadan olağandışı bir boşluk göremedim. – Smills

+1

Benim olup olmadığından emin değilim, ama sanırım * zorlukla * farkedilebilir bir kekemelik (LG Optimus One 2.2 üzerinde denedim) – bigstones

cevap

0

geliyor. Çok sayıda kısa süreli küçük nesne oluşturuyorsanız, kendi havuzunuzu yönetmeyi düşünün. Havuzun sınırsız büyümesine izin vermediğiniz sürece, bu, zamanlamanızın öncelenmesiyle ilgili olarak gc'yi büyük ölçüde azaltabilir.

+1

Bölüm "NOT: çöp toplayıcı ile ilgili değil.Eğer olduğunu düşünüyorsanız, sadece günlüğüne bakın, çöp toplayıcı, kekeliğin ortaya çıktığı kadar yakın bir yerde çalışır. " başlangıçta oradaydım :) İyi bir öneri olsa da, asıl soruda aynı sorunu üstlendim ve aynı çözümü önerdim. http://stackoverflow.com/questions/4867732/traceview-shows-some-methods-arent-being-called-for-200ms-or-more/ –

+1

Evet, ne yazık ki çöp toplayıcı gibi görünmüyor. Keşke güzel ve düzeltilmesi kolay olurdu. Örneğinize bir bakışınız varsa, çalışma zamanında çöp üreten tüm çağrıları (veya hemen hemen tüm çağrıları) elimden kaldırdım. – Smills

1

Telefonumda denedim (nexus one), benim için aynıydı.

benim için daha iyi yapılmış birkaç değişiklik yaptı:

yerine döngü sırasında yeni değişkenler her zaman bildirmek i ilan
  1. sınıfa

    Tuval c = null özellikleri olarak; // olur

    özel Tuval c;

    // döngü içinde artık sadece

c = null doDraw ve updatePhysics işlevinde tekrar tekrar beyan tüm değişken için yapın kullanın.yerine sonsuza dek viewy artan

  1. , ben sadece eğer biraz koymak statemant

    (viewy> mCanvasHeight) {

    viewY -= mCanvasHeight; 
    

    }

ben isem

şimdi% 100 çalışıp çalışmadığından emin değilim ama bana göre daha iyi görünüyor.

+0

Ah, Ben bunu verdi ve biraz daha pürüzsüz yapmak gibi görünüyor, ama ne yazık ki hala telefonumda kekemelik. Bir arkadaşımın Desire HD'sinde denemeyi başardım ve telefonunda pürüzsüzlük vardı. Sadece biraz garip olan bazı cihazları etkiliyor gibi görünüyor. – Smills

+0

Bu değişikliğin herhangi bir şeyi etkilemesi ihtimali nedir?Bu kod değişikliğinin herhangi bir gerçek fark yarattığına şüphem var ve sanırım şimdi daha yumuşak olduğunu düşündüğünüz bir plasebo. @Smills: Desire HD, Milestone'dan çok daha güçlü. Milestone, oyunlarda en yeni telefonlardan çok daha yavaş görünüyor. Bazı yeni Milestone uygulamalarının daha yeni telefonlarda pürüzsüz olduğunu fark ettim. – rbcc

0

Bir Verizon DroidX (2.2.1) üzerinde test ettim ve her 3-6 saniyede ve ÇOK kısa olarak görünüyor. Aktif duvar kağıdı kapalı ve başka hiçbir şey çalışan ile biraz daha iyi görünüyor. Belki de grafik alt sistemi devam edemiyor mu? Ne yaptığını görmek için daha az grafik yoğun bir görüntü (daha az piksel ve daha az renk) denediniz mi?

0

Çerçeve başına üç büyük arka plan bitmap'i çiziyorsunuz ... bu, yapmanız gerekenden daha fazla iş. Tekrarlamak için TileMode ayarlı bir BitmapShader kullanmak daha iyi olabilir. Sonra yerel katmana sadece bir çağrı. Sonra

BitmapShader shader = new BitmapShader(mBackgroundImage, 
    TileMode.CLAMP, TileMode.REPEAT); 
paint = new Paint(); 
paint.setShader(shader); 

doDraw() sadece bu olmalıdır:

aşağıdaki satırları içerecek şekilde bir yerde Paint paint; üye ekleme ve setSurfaceSize() değiştirmek

//translate to viewY position 
canvas.translate(0,(float)(-viewY)); 

//draw backgrounds 
canvas.drawPaint(paint); 

Aslında bu ölçmedin'un daha hızlı olduğunu kanıtlayın, ancak grafik API'ları hakkında bildiklerimden kesinlikle emin olmalısınız.