2010-11-22 2 views
6

Çöp toplayıcım çalıştığında Android oyunda zaman zaman gecikmeler yaşıyor. Ben DDMS koştum ve hafızanın tüm uygulama tarafından bu hattan olduğunu tahsis edilen keşfetti:Bir tamsayı bellek ayırmadan bir dizeye dönüştürme

scoreString = String.valueOf(score); 

herhangi bellek ayırmadan bir dizeye bir tamsayı dönüştürmek için en iyi yolu nedir?

+0

şeyler görüntülediğiniz bir yol gibi gözüküyor sorunu olduğunu char döküm ve (ASCII içinde '0') 48 ekleme değerleri için başka bir karakter dizisini kullanabilirsiniz. Çöp toplayıcı veya dizgi tahsisi oyununuzu gerçekten engelliyorsa, maskeleyeceğiniz başka ciddi sorunlarınız var demektir. – Falmarri

+0

Açıklayabilir misiniz? Çöp toplayıcı muhtemelen Android oyunlarında en yaygın performans sorunudur. Ayrıca, performans yavaşladığında kısa süreler (bir saniyeden daha az) haricinde iyidir. Günlük çıktısına bakıldığında, bu çöpler çöp toplama ile sıralanıyor. – Computerish

cevap

12

Skor olarak görüntülenecek bir karakter dizisini ayırın ve bu diziye puanın her bir basamağına dayalı olarak eklemek için 0-9'luk bir arama tablosu kullanın (bu, yine de 0 tabanlı bir diziyle eşleşir).

Düzenleme: puanınızı basamak ayıklamak için:

skorun karakter dizisi için maksimum uzunluğu (skorun depolamak için kullandığınız ne olursa olsun dayanmalıdır bilebilirsiniz Ayrıca
 
12345 mod 10 = 5 
12345 mod 100 = 45/10 = 4.5 (floors to 4) 
12345 mod 1000 = 345/100 = 3.45 (floors to 3) 
12345 mod 10000 = 2345/1000 = 2.345 (floors to 2) 
12345 mod 100000 = 12345/10000 = 1.2345 (floors to 1) 

yani int)

tavsiye ters dolduran bu diziyi ve bunu herkese başlatılıyor '0' böylece skor sadece koştu

 
0000000000 
0000005127 
+0

Bu gerçekten tek yol mu? Bunun için gerekli matematik miktarı göz önüne alındığında, sadece bellek ayırmaktan daha hızlı olursa tamamen emin değilim. Bu kod saniyede birçok kez çağrılan bir döngüde. – Computerish

+1

Elbette, çarpışma tespiti ve yanıtı için gereken her şeyden daha az matematik olduğundan veya oyununuzun sıkça değişen puanları gerektirmesi için gereken başka mekanikler olduğundan şüpheliyim? –

0

gibi gösterecektir Bu soruna ayrıca, eğer GC bir çerçeve sırasında devreye girerse gerçekten fark etmez. Bu çözümle geldim.

Arabelleği geriye doğru doldurursanız, yalnızca % 10 ve / 10 numaralarını tekrarlayabilirsiniz.

StringBuilder'a bir sayı ekleyen bir çalışma uygulaması, muhtemelen bunu yapmanın en iyi yolu değil, işe yarar ve hiçbir ayırmaya neden olmaz. Ayrıca yerine buraya

private char[] sbBuffer = new char[20]; 
private void appendInt(StringBuilder sb, int num) { 
    int i,j; 
    i = sbBuffer.length - 1; 
    if (num == 0) { 
     j = sbBuffer.length - 1; 
     sbBuffer[j] = (char) 48; 
    } else { 
     if (num < 0) 
      sb.append('-'); 
     num = Math.abs(num); 
     while (num > 0) { 
      sbBuffer[i] = (char) (num % 10 + 48); 
      i--; 
      num /= 10; 
     } 
     j = i + 1; 
    } 

    sb.append(sbBuffer, j, sbBuffer.length - j); 

    /* clean up */ 
    for (i = j; i < sbBuffer.length; i++) 
     sbBuffer[i] = 0; 
}