2012-02-20 21 views
7

Estoy desarrollando un juego y está avanzando bastante bien. Sin embargo, tengo un pequeño problema con el anuncio de AdMob refrescante. Cada vez que el anuncio se actualiza o se dibuja un aspecto diferente del anuncio, mi velocidad de fotogramas cae en picado y casi hace que el juego no se pueda reproducir. Aquí es lo que tengo para la carga de la publicidad ...Android, AdMob: la actualización de anuncios de AdMob destruye la velocidad de fotogramas

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

Mi solución para la prestación del anuncio en la parte superior de la SurfaceView era simplemente agregarlo a una RelativeLayout y añadir tanto los SurfaceView y AdView a ella. Todo esto funciona bien y dandy, pero cada vez que se actualiza el anuncio (UI o nueva solicitud de anuncio), empantana el subproceso de la interfaz de usuario, que a su vez ralentiza mi hilo de renderizado.

¿Hay alguna manera de que pueda hacer todo esto bien para que todo el trabajo realizado por AdView se realice por separado del hilo principal? No estoy muy seguro de actualizar dinámicamente el diseño actual de otro hilo.

Gracias por la ayuda.

+0

No hay picaduras ....... :( – SemperGumbee

Respuesta

8

Tuve este problema también. Descubrí que fue causada por los anuncios de Google que se animan cuando cambian, en lugar de anuncios publicitarios estáticos de Admob que no se animan en absoluto. Hay una configuración en la configuración de su aplicación admob para controlar si se utilizan los anuncios de Google ... intente apagarla para ver si hace la diferencia.

+1

Esto sin duda ayuda. Is ¿Hay algo más que pueda hacer para arreglar esto mientras sigo incorporando Adsense en los anuncios? – SemperGumbee

+2

Puede probar con las prioridades de los hilos. Intente disminuir la prioridad de su hilo principal, de modo que combata menos con el hilo de renderizado y el hilo del motor del juego. y nuestro hilo de interfaz de usuario no hará más que actualizar ese anuncio, con baja prioridad. –

+0

He estado buscando e incapaz de encontrar dónde está esta configuración. Estoy usando el nuevo sitio web apps.admob.com. ¿Esta opción de configuración todavía existe? – talloaktrees

3

Disculpas por resucitar a esta pregunta, pero me las he arreglado para venir a través de la misma cuestión, y descubrió que girar LAYER_TYPE_SOFTWARE en el AdView 's interna WebView hizo más suave.

He confirmado que esto funciona de mi lado con la versión 8.4.0 que se ejecuta en Android 5.1, aunque es posible que esta solución alternativa beneficie a más dispositivos con CPU más fuertes.

En onResume de mi actividad Tengo

/* 
* 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 la interfaz método runOnWebView y WebViewAction definido como

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