2012-02-20 55 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); 
}