我扩展了 GLSurfaceView 并实现了我自己的 GLSurfaceView.Renderer,以创建我的第一个相对简单的 Android 2D OpenGLES 游戏。
我一直在活动 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);
现在,我的应用程序以看似随机的间隔在 43 fps 和 60 fps 之间波动。我查看了 LogCat,GC 没有运行过多(每 20 秒左右一次)。
- 将表面视图移动到 XML 布局时,我是否应该预期帧速率会降低?
- 是否有其他方法可以在不使用 XML 布局的情况下显示 admob 广告?
- 我可以做些什么来确定为什么我的应用程序 FPS 在特定时间降低?
任何帮助将不胜感激,因为我希望能够在不久的将来通过我的 OpenGL 应用程序获利。
GLSurfaceView 作为 SurfaceView 在窗口中的表示方式略有不同。
“SurfaceView 在其窗口中打一个孔,以允许其表面
被显示。视图层次结构将正确处理
与 SurfaceView 的任何同级 Surface 进行合成
通常会出现在其顶部。这可用于放置叠加层
例如 Surface 顶部的按钮,但请注意,它可以
由于完全阿尔法混合复合材料对性能有影响
每次 Surface 发生变化时都会执行。”
第一步,您需要在主窗口顶部的单独窗口(层)中绘制 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>
希望这可以帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)