0

这是一个奇怪的问题,我花了很长时间才可靠地重现。

我有一个非常简单的菜单活动;只是一些在 xml 中定义的按钮。

我有一个带有 GLSurfaceView 布局和一些在 xml 中定义的按钮的活动。这些按钮定义了 onClick 属性。此活动可从菜单活动中访问。

在 OpenGL 活动中,有关联的 onClick 函数“onFoo(View view)”。

当我使用本机后退按钮导航回菜单活动时,没有任何有趣的事情发生;但是,当我单击任何带有 onClick 属性的 xml 定义的按钮,然后导航回菜单活动上的某些 ImageView 时,它会显示为黑色,但否则会显示为正确的位置、大小等。它们的 xml 定义的 onClick 函数也可以正常工作.

我正在重新导出菜单活动中的所有图像(以消除任何导出设置缺陷,因为资产最初是在不同时间导出的),但是当我等待这种情况发生时,我想也许有人遇到了这个之前的问题。

为了限制这个问题中的变量,我什至在 OpenGL 活动中注释掉了函数的内容,以确保 onClick 函数中没有任何内容导致冲突。

例如

public void onMainMenu(查看视图){}

因此,澄清一下,如果我使用上面的空方法单击带有 onClick 属性的 xml 中定义的按钮,例如 android:onClick="onMainMenu",然后按本机后退按钮会出现问题,但在跳过单击 onMainMenu 时不会按钮。

我不能确定是否总是相同的一组 ImageView 变黑,但是一个 ImageView 似乎确实可以始终使用正确的 Drawable 生存;这很奇怪,因为除了 src 属性之外,ImageView 的定义相同。它们的大小都相对相同,而且一点也不大。

我最初认为它与 EGL 上下文有关(Android 在打开 openGL 上下文后显示黑色矩形而不是可绘制图像)(现在仍然可能是这种情况),但后来我发现了如何通过 100% 的时间重现它在向后导航之前按下具有 onClick 属性的按钮。内存使用受到控制,我迷失了可能的解决方案或找到一个解决方案。

我可以在我拥有的三台设备上重现这一点:HTC One、Droid Bionic、Galaxy Tab 2 7。

应用程序是 minSdk:14, target:17。硬件加速已开启。

我尝试使用硬件加速设置,结果如下:

如果我关闭应用程序的硬件加速,并将其添加到 OpenGL 活动中,则不会出现主菜单问题,但在 OpenGL 活动中开始出现相同的问题。在这个活动的情况下,一些 ImageView 的可绘制资源在运行时被切换。切换的资源正确显示,但是当切换回为 xml 中的 ImageView 定义的相同资源时,它呈现黑色。

为了澄清切换:在一种情况下,我有一个带有可绘制状态选择器的视图作为其背景。在两种状态之间切换时(它们的功能类似于选项卡,即它们在 xml 中定义的默认状态相反),默认状态始终显示为黑色,但辅助状态显示正确。

如果我关闭应用程序和 OpenGL 活动的硬件加速,问题似乎完全消失了。

我担心将其用作解决方案,因为我无法确定在我不必测试的设备上可能出现的任何性能问题。

从 OpenGL 活动中删除硬件加速会破坏至少在 Droid Bionic 上覆盖 GLSurfaceView 的视图,所以我宁愿不使用这个伪解决方案。

这是我第一次在 Stack Overflow 上发布问题。我总是能找到可靠的线索搜索,但在这种情况下找不到解决方案,甚至找不到类似情况的问题。

感谢社区提供的任何帮助和智慧!

4

1 回答 1

1

问题归结为对 GLES20.glDeleteTextures(int size, int[] textureNames, int offset) 的调用。我在 onPause() 期间调用了这个,这在某种程度上导致了冲突。我不确定它与触摸 GLSurfaceView 之外的 UI 项目有什么关系。删除一个电话以某种方式防止了这个问题。

于 2013-08-19T22:36:53.310 回答