2012-02-20 11 views
7

Bir oyun geliştiriyorum ve oldukça güzel bir şekilde geliyor. Ancak AdMob reklamının yenilenmesiyle ilgili bir sorunum var. Reklam her yenilendiğinde veya reklamın farklı bir yönünü çizdiğinde, kare hızım düşer ve neredeyse oyunu oynatılamaz hale getirir. İşte SurfaceView üstünde reklam görüntülenirken içinAndroid, AdMob: AdMob reklam yenileme kare hızını yok eder

ad = new AdView(this, AdSize.BANNER, "..."); 

    AdRequest adRequest = new AdRequest(); 
    adRequest.addTestDevice("..."); 
    adRequest.addTestDevice("..."); 

    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
      RelativeLayout.LayoutParams.WRAP_CONTENT, 
      RelativeLayout.LayoutParams.WRAP_CONTENT); 
    lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
    lp.addRule(RelativeLayout.CENTER_HORIZONTAL); 
    ad.setLayoutParams(lp); 

    RelativeLayout layout = new RelativeLayout(this); 
    layout.addView(renderView); 
    layout.addView(ad); 
    ad.loadAd(new AdRequest());  

    setContentView(layout); 

Benim çözümüm sadece RelativeLayout eklemek ve SurfaceView ve buna AdView hem eklemek oldu ... Ben reklamın yüklenmesi için ne var. Tüm bunlar gayet iyi çalışıyor, ancak reklam her yenilendiğinde (kullanıcı arayüzü veya yeni reklam isteği), kullanıcı arayüzü iş parçacığını aşağı çekiyor, bu da render iş parçamı yavaşlatıyor.

Tüm bu çalışmayı, AdView tarafından yapılan tüm işlerin ana iş parçasından ayrı olarak yapılması için güzel bir şekilde birlikte yapabileceğim bir yol var mı? Geçerli düzeni başka bir iş parçacığından dinamik olarak güncellemekten pek emin değilim.

Yardımlarınız için teşekkürler.

+0

yok sokması olarak tanımlanan runOnWebView yöntemi ve WebViewAction arayüzü ile

/* * The AdView attaches it's internal WebView only once it * has been loaded, so we need to wait until that happens. */ adView.setAdListener(new AdListener() { @Override public void onAdLoaded() { runOnWebView(mAdView, new WebViewAction() { @Override public void run(WebView view) { // the most important part is here view.setLayerType(View.LAYER_TYPE_SOFTWARE, null); } }); } }); 

var :( – SemperGumbee

cevap

8

Bu problemi de yaşadım. Bunun, hiçbir zaman animasyon oluşturmayan statik AdMob banner reklamları yerine, ne zaman değiştiklerini canlandıran Google reklamlarından kaynaklandığını gördüm. Google reklamlarının kullanılıp kullanılmadığını kontrol etmek için admob uygulama ayarlarınızda bir ayar var ... fark yaratıp yaratmadığını görmek için kapatmayı deneyin. Bu soruyu diriltmeyi için

+1

Bu yardım Gerçekten de öyle. Is Adsense'i reklamlara dahil ederken bunu düzeltmek için yapabileceğim başka bir şey var mı? – SemperGumbee

+2

İplik öncelikleriyle uğraşmayı deneyebilirsiniz.İç parçacığınızın önceliğini düşürmeyi deneyin, böylece render ipliği ve oyun motoru ipliği ile daha az mücadele eder. y UI iş parçacığımız, düşük önceliğe sahip bir reklamı güncellemekten başka bir şey yapmayacak. –

+0

Bu ayarın nerede olduğunu bulup bulamadık. Yeni apps.admob.com web sitesini kullanıyorum. Bu ayar seçeneği hala mevcut mu? – talloaktrees

3

Özür dileriz, ama aynı sorunu rastlamak başardı ve üzerinde LAYER_TYPE_SOFTWARE dönüm AdView 'ın WebView iç daha yumuşak yapılmış öğrendim.

Bu geçici çözümün daha güçlü CPU'larla daha fazla aygıta faydası olabileceği halde, Android 5.1'de çalışan 8.4.0 sürümüyle bu konuda çalışmamın onaylandığını onaylıyorum. Benim etkinliğin onResume yılında

Ben .......

/** 
* Recursively searches for a WebView instance located in 
* the hierarchy of view and invokes the callback method on 
* action with the found instance. 
*/ 
private void runOnWebView(View view, WebViewAction action) { 
    if (view instanceof WebView) { 
     action.run((WebView) view); 
     return; 
    } 

    if (view instanceof ViewGroup) { 
     final ViewGroup parent = (ViewGroup) view; 

     for (int i = 0; i < parent.getChildCount(); i++) { 
      runOnWebView(parent.getChildAt(i), action); 
     } 
    } 
} 

private interface WebViewAction { 

    void run(WebView view); 
}