2012-02-20 13 views
7

私はゲームを開発しています。私はAdMobの広告について少し問題があります。広告がリフレッシュされるたびに、または広告の別の側面が描画されるたびに、フレームレートが急激に低下し、ゲームがほとんど再生できなくなります。ここで私は、広告の読み込みのために持っているものです... SurfaceViewの上に広告をレンダリングするための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); 

私のソリューションは、ちょうどRelativeLayoutに追加し、それにSurfaceViewAdViewの両方を追加することでした。これはすべてうまく動作しますが、広告がリフレッシュされるたびに(UIまたは新しい広告リクエスト)、UIスレッドが駄目になり、レンダースレッドが遅くなります。

すべての作業をまとめてメインスレッドとは別にAdViewで行うことができますか?現在のレイアウトを別のスレッドから動的に更新することについてはあまり気にしていません。

ありがとうございました。

+0

ませ刺されのように定義runOnWebView方法とWebViewActionインターフェースを持つ

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

を持っている:( – SemperGumbee

答えて

8

この問題もありました。私はそれが、アニメーション化されない静的なAdmobバナー広告ではなく、変化したときにアニメートするGoogle広告によって引き起こされていることを発見しました。 Google広告が使用されているかどうかを制御するためのAdMobアプリ設定の設定があります。違いがあるかどうかを調べるには、それをオフにしてみてください。

+1

これは、ヘルプ確かにありません。です広告にAdsenseを組み込んだままでこれを修正するために私ができることは何ですか? – SemperGumbee

+2

スレッドの優先順位をつけて試すことができます。メインスレッドの優先順位を下げて、レンダリングスレッドとゲームエンジンスレッドとの競合を少なくしてください。 y私たちのUIスレッドは、低いプライオリティでその広告を更新するだけです。 –

+0

私はこれを探していて、この設定の場所を見つけることができませんでした。私は新しいapps.admob.comウェブサイトを使用しています。この設定オプションはまだ存在しますか? – talloaktrees

3

この質問を復活させるための謝罪が、私は同じ問題に遭遇するために管理し、かつAdViewの内部WebViewLAYER_TYPE_SOFTWAREを回すと、それがスムーズに行われていることを見出しました。

Android 5.1で動作しているバージョン8.4.0で私の側でこれが動作していることを確認しましたが、この回避策でより強力なCPUを搭載したデバイスが増える可能性があります。私の活動のonResumeで

私は.......

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