2012-03-13 58 views
3

我已经扩展了GLSurfaceView并实现了我自己的GLSurfaceView.Renderer来创建我的第一个相对简单的2D OpenGLES游戏。XML FrameLayout降低了我的OpenGL SurfaceView帧率(fps)

我一直在活动onCreate方法上使用以下代码测试我的游戏,该方法将表面视图设置为内容视图,并从中获取恒定的60fps。

60fps的活动:

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

不过我现在已经转移到一个XML布局,使我可以将AdMob广告覆盖在屏幕的右下角,

AdMob的XML:

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

admob活动:

setContentView(R.layout.main); 

现在我的应用程序在43fps和60fps之间波动,看似随机的时间间隔。我已经看过LogCat,并且GC没有过度运行(每20秒左右一次)。

  • 当我将表面视图移动到XML布局时,我是否应该预期较低的帧频?
  • 是否有另一种显示admob广告而不使用XML布局的方法?
  • 有什么我可以做的,以确定为什么我的应用程序FPS在特定时间降低?

任何帮助将不胜感激,因为我希望能够在不久的将来通过我的OpenGL应用程序货币化。

+0

我决定接受窗口的答案,因为这确实增加了我的帧率 - 不过,我将奖赏奖给@RajPara作为他的回答,因为它解释了如何将admob视图添加到现有布局。 – TerryProbert 2012-04-25 18:12:57

回答

5

作为一个SurfaceView的GLSurfaceView在窗口中有一点点不同的表现方式。

“的SurfaceView冲头在其窗口中的孔,以允许其表面 被显示。该视图层次结构将采取正确 合成的护理与表面SurfaceView的任何兄弟姐妹的是 通常会出现上的顶它。这可以被用于放置叠加 如上表面的顶部按钮,虽然记然而,它可以 具有自全alpha混合复合 将每次进行表面变化对性能产生影响。”

第一步你需要绘制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是最重要的,你不需要额外的抽象。

在你的主题添加

希望这有助于。

+0

我试过你的代码片段与Greystripe广告网络。工作正常,但我遇到了一个我无法解决的问题:如果我点击横幅广告,浏览器打开并显示广告 - 一切正常,但是当我回到我的应用程序时,我看到一个黑屏和广告。不知何故,我的OpenGL视图消失:( – Maecky 2012-07-13 10:27:50

+0

据我所知,当你打开另一个窗口/关闭OpenGL surfaceview卸载所有纹理,你需要重新加载纹理。 – EvilDuck 2012-07-14 07:19:13

0

我之前读过类似的东西,解决方法是将 叠加层放在单独的窗口中,在glsurfaceview之上。

1

要回答其中的一点,您可以创建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

我不记得在哪里,但我在Android的挑衅看了一些地方,当你正在更新一个视图,如您OpenGLTest1SurfaceView,屏幕失效是在你的观点是,如果你采取这样矩形发射将admobe放在它上面,你的fps会掉下来。如果你把admobe放在它旁边,你会没事的。