XML FrameLayout снизил мою частоту кадров OpenGL SurfaceView (fps) - PullRequest
3 голосов
/ 13 марта 2012

Я расширил GLSurfaceView и реализовал свой собственный GLSurfaceView.Renderer, чтобы создать мою первую относительно простую 2D игру OpenGLES для Android.

Я тестировал свою игру, используя следующий код для метода деятельностей onCreate, который устанавливает представление поверхности как представление контента, из которого я получил постоянные 60 кадров в секунду.

60 кадров в секундуактивность:

mGLView = new OpenGLTest1SurfaceView(this);
setContentView(mGLView);

Однако теперь я перешел на макет XML, чтобы я мог разместить наложение в правом нижнем углу экрана,

admob xml:

<Frame Layout...
<...OpenGLTest1SurfaceView...
<com.google.ads.adView...

admob активность:

setContentView(R.layout.main);

Теперь я приложение колеблется между 43fps и 60fps с, казалось бы, случайными интервалами.Я посмотрел на LogCat и GC не работает чрезмерно (один раз каждые 20 секунд или около того).

  • Должен ли я ожидать более низкую частоту кадров при перемещении моего вида поверхности в макет XML?
  • Есть ли альтернативный способ показа рекламных объявлений без использования макета XML?
  • Могу ли я что-нибудь сделать, чтобы определить, почему FPS моего приложения в определенное время понижается?

Любая помощь будет принята с благодарностью, потому что я хотел бы иметь возможность монетизировать свои приложения OpenGL вближайшее будущее.

Ответы [ 4 ]

5 голосов
/ 24 апреля 2012

GLSurfaceView, являющийся SurfaceView, имеет немного другой способ представления в окне.

"SurfaceView пробивает отверстие в своем окне, чтобы позволить его поверхности отображаться. Иерархия представления позаботится правильно составление с Surface любых братьев и сестер SurfaceView, которые обычно появляется поверх него. Это может быть использовано для размещения наложений такие как кнопки в верхней части поверхности, хотя обратите внимание, что это может оказывают влияние на производительность, так как полный альфа-смешанный композит будет выполняться каждый раз при изменении поверхности. "

Первым шагом вам нужно нарисовать AdMobView в отдельном окне (слое) поверх вашего главного окна. Вот пример того, как вы это делаете:

View topLocker = lockDownWindow.getChildAt(0);

WindowManager.LayoutParams windowParams = new WindowManager.LayoutParams();
windowParams.gravity = Gravity.TOP;
windowParams.x = 0;
windowParams.y = 0;
windowParams.height = WindowManager.LayoutParams.MATCH_PARENT;
windowParams.width = WindowManager.LayoutParams.MATCH_PARENT;
windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
    | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
    | WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS;
windowParams.format = PixelFormat.TRANSLUCENT;
windowParams.windowAnimations = 0;

WindowManager wm = getWindowManager();
wm.addView(yourAwesomView, windowParams);

"yourAwesomeView" - это макет, содержащий adView. Осторожно, вы должны правильно настроить флаги для окна, чтобы ваши прикосновения скользили к фоновому окну. Также вы несете ответственность за удаление этого окна.

Еще один совет, который у меня может быть, - попытаться отключить фон по умолчанию в вашей теме, поскольку ваш GLSurfaceView находится поверх него, вам не нужны дополнительные рисунки за ним.

в вашей теме добавьте

<item name="android:windowBackground">@null</item>

Надеюсь, это поможет.

1 голос
/ 14 марта 2012

Чтобы ответить на один из этих пунктов, вы определенно можете создать объявление AdMob и программно поместить его в иерархию своих представлений, вам, вероятно, просто нужно придать ему значение "bottom" или что-то такое, чтобы оно оставалось в нижней части.FrameLayout.

  AdView adView = new AdView(this, AdSize.BANNER, INSERT_ADMOB_ID_HERE);
  AdRequest adRequest = new AdRequest();
  adRequest.addTestDevice(AdRequest.TEST_EMULATOR);
  adView.loadAd(adRequest);
  // Add the adView into your view hierarchy using addView
  layout.addView(adView);
0 голосов
/ 24 апреля 2012

Я не помню, где, но я вызывающе прочитал в Android, что когда вы обновляете представление, такое как ваш OpenGLTest1SurfaceView, экран отключается на том прямоугольнике, который занимает ваше представление, поэтому, если вы разместите область видимости выше это ваш fps упадет. Если вы положите рядом с ним адмоба, все будет в порядке.

0 голосов
/ 13 марта 2012

Я читал о чем-то похожем недавно, решение было поставить наложение в отдельном окне поверх glsurfaceview.

...