2012-02-20 85 views
7

我正在开发一款游戏,它的出现非常好。不过,我确实对AdMob广告刷新有点问题。每次广告刷新或绘制广告的不同方面时,我的帧速率都会下降,几乎使游戏无法播放。以下是我对广告的加载...Android,AdMob:AdMob广告刷新破坏帧率

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

我呈现在SurfaceView顶部的广告解决方案是只需将其添加到RelativeLayout,并添加两个SurfaceViewAdView它。这一切都可以正常工作,但每次广告刷新(用户界面或新的广告请求)时,都会使用户界面线程陷入瘫痪,进而导致渲染线程变慢。

有没有一种方法,我可以做所有这些工作很好地在一起,有从主线程单独进行AdView中完成的所有工作?我不太确定从另一个线程动态更新当前布局。

感谢您的帮助。

+0

没有叮咬runOnWebView方法和WebViewAction接口....... :( – SemperGumbee 2012-02-27 20:45:54

回答

8

我也有这个问题。我发现这是由Google广告引起的,这些广告会在他们更改时生成动画,而不是静态的Admob横幅广告,它们根本不会生成动画。您的admob应用设置中有一个设置,用于控制是否使用Google广告......尝试关闭它以查看它是否有所作为。

+1

这的确确实帮助。是还有什么我可以做的,为了解决这个问题,同时保持Adsense并入广告? – SemperGumbee 2012-02-29 17:13:22

+2

你可以尝试摆脱线程优先级,尝试降低你的主线程的优先级,所以它与你的渲染线程和游戏引擎线程打架较少。 ÿ我们的用户界面线程只会以低优先级更新广告。 – 2012-02-29 17:38:54

+0

我一直在寻找,无法找到这个设置的位置。我正在使用新的apps.admob.com网站。这个设置选项是否仍然存在? – talloaktrees 2014-01-29 11:48:12

3

道歉复活这个问题,但我已成功地遇到了同样的问题,并且发现了开启LAYER_TYPE_SOFTWAREAdView的内部WebView使其顺畅。

我已确认在我身边与8.4.0版本在Android 5.1上运行这个工作,虽然这是可能的,这变通办法将具有更强的CPU中受益更多的设备。

在我的活动的的onResume我

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

定义为

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