2012-02-20 32 views
7

Rozwijam grę i ładnie się nad nią pracuje. Mam jednak pewien problem z odświeżaniem reklamy AdMob. Za każdym razem, gdy reklama jest odświeżana lub rysuje inny aspekt reklamy, szybkość wyświetlania klatek spada i prawie uniemożliwia odtworzenie gry. Oto co mam do załadunku reklamy ...Android, AdMob: odświeżenie reklamy AdMob niszczy liczbę klatek na sekundę

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); 

Moje rozwiązanie do renderowania reklamy na górze SurfaceView było po prostu dodaj go do RelativeLayout i dodać zarówno SurfaceView i AdView do niego. Wszystko działa dobrze i elegancko, ale za każdym razem, gdy reklama się odświeża (UI lub nowe żądanie reklamy), przesuwa się w dół wątku UI, co z kolei spowalnia mój wątek renderowania.

Czy istnieje sposób, w jaki mogę sprawić, by całość tej pracy była ładnie wykonana, aby praca wykonywana przez AdView była wykonywana oddzielnie od głównego wątku? Nie jestem pewien, czy dynamicznie aktualizować bieżący układ z innego wątku.

Dzięki za pomoc.

+0

nie gryzie ....... :( – SemperGumbee

Odpowiedz

8

Miałem ten problem. Zauważyłem, że jest to spowodowane reklamami Google, które animują się po zmianie, a nie statycznymi reklamami banerowymi AdMob, które w ogóle nie są animowane. W ustawieniach aplikacji admob znajduje się ustawienie do kontrolowania, czy reklamy Google są używane ... spróbuj wyłączyć tę opcję, aby sprawdzić, czy to ma znaczenie.

+1

to robi rzeczywiście pomaga. Czy Coś jeszcze mogę zrobić, aby to naprawić, jednocześnie zachowując Adsense w reklamach? – SemperGumbee

+2

Możesz próbować bawić się priorytetami wątku. Spróbuj obniżyć priorytet wątku głównego, więc walczysz mniej z wątkiem renderowania i wątkiem mechanizmu gry. y nasz wątek UI będzie robił tylko aktualizację reklamy z niskim priorytetem. –

+0

Szukałem i nie mogę znaleźć, gdzie to ustawienie jest. Używam nowej witryny apps.admob.com. Czy ta opcja ustawień nadal istnieje? – talloaktrees

3

Przeprosiny dla wskrzeszenia to pytanie, ale udało mi się natknąć w tej samej sprawie, i okazało się, że obracając LAYER_TYPE_SOFTWARE na AdView „s wewnętrzny WebView stało się gładsza.

Potwierdziłem, że działa to po mojej stronie z wersją 8.4.0 działającą na systemie Android 5.1, chociaż jest możliwe, że obejście to przyniesie korzyści większej liczbie urządzeń z silniejszymi procesorami.

W mojej działalności za onResume mam

/* 
* 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); 
      } 
     }); 
    } 
}); 

z interfejsu Metoda runOnWebView i WebViewAction zdefiniowany jako

/** 
* 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); 
} 
Powiązane problemy