Android, AdMob: обновление рекламы AdMob снижает частоту кадров - PullRequest
7 голосов
/ 20 февраля 2012

Я занимаюсь разработкой игры, и она идет довольно неплохо. У меня есть небольшая проблема с обновлением рекламы 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 выполнялась отдельно от основного потока? Я не слишком уверен в динамическом обновлении текущего макета из другого потока.

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

Ответы [ 2 ]

8 голосов
/ 28 февраля 2012

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

3 голосов
/ 09 января 2016

Извините за воскрешение этого вопроса, но мне удалось столкнуться с той же проблемой, и обнаружил, что поворот LAYER_TYPE_SOFTWARE на внутреннем WebView *1005* сделал его более плавным.

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

В резюме моей деятельности у меня есть

/*
 * 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...