2012-02-20 18 views
7

Sto sviluppando un gioco e sta procedendo molto bene. Tuttavia, ho un po 'di problemi con l'aggiornamento dell'annuncio AdMob. Ogni volta che l'annuncio viene aggiornato o se ne disegna un aspetto diverso, la mia frequenza fotogrammi precipita e rende quasi ingiustificabile il gioco. Ecco quello che ho per il caricamento dell'annuncio ...Android, AdMob: l'aggiornamento dell'annuncio AdMob distrugge la frequenza fotogrammi

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

La mia soluzione per il rendering della scheda sulla parte superiore del SurfaceView era di aggiungere solo che un RelativeLayout e aggiungere sia la SurfaceView e AdView ad esso. Tutto questo funziona bene e dandy, ma ogni volta che l'annuncio si aggiorna (interfaccia utente o nuova richiesta di annuncio), si blocca il thread dell'interfaccia utente, che a sua volta rallenta il mio thread di rendering.

C'è un modo per far funzionare tutto questo insieme in modo che tutto il lavoro svolto da AdView sia svolto separatamente dal thread principale? Non sono troppo sicuro di aggiornare dinamicamente il layout corrente da un altro thread.

Grazie per l'aiuto.

+0

Nessun morsi ....... :( – SemperGumbee

risposta

8

Ho avuto anche questo problema. Ho scoperto che era causato da annunci Google che si animano quando cambiano, piuttosto che da banner pubblicitari Admob statici che non si animano affatto. C'è un'impostazione nelle impostazioni dell'app admob per controllare se vengono utilizzati gli annunci di Google ... prova a disattivarlo per vedere se fa la differenza.

+1

Questo fa davvero di aiuto. E ' c'è qualcos'altro che posso fare per aggiustare questo mantenendo Adsense incorporata negli annunci? – SemperGumbee

+2

Puoi provare a giocherellare con le priorità dei thread. Prova a ridurre la priorità del thread principale, quindi combatte meno con il thread di rendering e il thread del motore di gioco. y il nostro thread dell'interfaccia utente non farà altro che aggiornare quell'annuncio, a bassa priorità. –

+0

Ho cercato e non riesco a trovare dove è questa impostazione. Sto usando il nuovo sito web apps.admob.com. Questa opzione di impostazione esiste ancora? – talloaktrees

3

Scuse per resuscitare questa domanda, ma sono riuscito a incontrare lo stesso problema, e ha scoperto che girando LAYER_TYPE_SOFTWARE sulla s' interno WebView il AdView ha reso più agevole.

Ho confermato questo lavoro dalla mia parte con la versione 8.4.0 in esecuzione su Android 5.1, anche se è possibile che questa soluzione andrà a beneficio più dispositivi con CPU più forti.

In onResume della mia attività ho

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

con l'interfaccia metodo di runOnWebView e WebViewAction definito come

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