2012-02-20 1 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 и добавить как SurfaceView и AdView к нему. Все это прекрасно работает и денди, но каждый раз, когда реклама обновляется (пользовательский интерфейс или новый запрос объявления), он заворачивает поток пользовательского интерфейса, что, в свою очередь, замедляет поток рендеринга.

Есть ли способ, с помощью которого я могу сделать все это хорошо, чтобы все работы, выполненные AdView, выполнялись отдельно от основного потока? Я не слишком уверен в динамическом обновлении текущего макета из другого потока.

Спасибо за помощь.

+0

Нет укусы ....... :( – SemperGumbee

ответ

8

У меня тоже была эта проблема. Я обнаружил, что это было вызвано объявлениями Google, которые ожидают, когда они меняются, а не статичными рекламными баннерами Admob, которые вообще не ожидают. В настройках вашего admob-приложения есть настройка для контроля использования объявлений Google ... попробуйте отключить его, чтобы убедиться, что это имеет значение.

+1

Это действительно помогает. Есть есть ли что-нибудь еще, что я могу сделать, чтобы исправить это, сохранив Adsense в объявлениях? – SemperGumbee

+2

Вы можете попробовать заняться приоритетами потоков. Попытайтесь снизить приоритет основного потока, поэтому он меньше борется с потоком рендеринга и потоком игрового движка. Y наш поток пользовательского интерфейса будет делать ничего, кроме обновления этого объявления, с низким приоритетом. –

+0

Я искал и не смог найти, где находится этот параметр. Я использую новый сайт apps.admob.com. Этот параметр настройки все еще существует? – talloaktrees

3

Извиняюсь за воскресить этот вопрос, но мне удалось встретить тот же вопрос, и выяснилось, что превращение LAYER_TYPE_SOFTWARE на AdView «s внутренний WebView сделал ее более гладкой.

Я подтвердил, что это работает на моей стороне с версией 8.4.0, работающей на Android 5.1, хотя возможно, что это обходное решение принесет пользу больше устройств с более сильными процессорами.

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

с интерфейсом метода runOnWebView и WebViewAction определяется как

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