【问题标题】:Render problems on Android using OpenGL ES 2.0使用 OpenGL ES 2.0 在 Android 上渲染问题
【发布时间】:2014-06-03 11:13:04
【问题描述】:

我在 Android 上的某些渲染有问题。我花了两天时间寻找解决方案,但找不到相关的东西。我会感谢任何能给我提示的人。

情况:我有一个活动,其中我使用了两个不同的片段。在第一个片段中,我使用了两个自定义 GLSurfaceViews,每个都有一个自定义渲染器。 gl 表面视图正在显示一些位图。 在第二个片段中,我使用一个自定义 GLSurfaceView 和自定义渲染器。此视图渲染相机帧。注意:片段之间的导航是使用切换按钮完成的(隐藏/显示片段)。第一次,第一个活动是可见的,当按下切换按钮时,第二个片段变得可见)

问题:

用例:

用户进入活动,两个 GLSurfaceView 似乎可以正确渲染位图。当我按下切换按钮以转到第二个片段时,这就是出现问题的地方。 视频在 GLSurfaceView 上渲染但在其右上角不知何故显示了在第一个 Android 片段中渲染的第二张图像。它给我的印象是第一个片段中使用的第二个 SurfaceView 仍然在第二个片段中渲染(在相同的位置)注意:第一个 Android 片段中的两个 opengl 表面视图小于第二个片段中使用的那个。 当我返回到第一个片段时,我看不到在第一个 GLSurfaceView 中呈现的位图,而是看到了相机的最后一帧(已停止)。第二个图像被正确渲染(与相机帧顶部的第二个片段中出现的图像相同)。

如果活动从第二个片段开始,视频帧显示正确,然后当我切换到第一个片段时,问题再次出现。

我调用表面视图的 onPause()、onResume() 方法,并在离开每个片段时释放纹理以及所有缓冲区和程序。 p>

有没有办法在同一个 Activity 中使用多个 GLSurfaceView 和它们自己的渲染而不会出现此类问题?

谢谢提前。如果我不是很清楚,请说出来,我会做一个草图(由于法律问题不能放截图)。

任何提示可能会有所帮助,谢谢你们! :)

编辑:

我通过在片段之间导航时删除/添加 GLSurfaceViews 解决了我的问题。在 onResume 中,我将 GLSurfaceView 添加到其父级 - parent.addView(mSurface),在 onPause 中,我从其父级 - parent.removeView(mSurface) 中删除了 myGLSurfaceView。

但是......我仍然不知道为什么第一种方法不起作用。我的问题已解决,但欢迎有类似问题的其他人解释。

【问题讨论】:

标签: android android-fragments rendering opengl-es-2.0 glsurfaceview


【解决方案1】:

Android 不容易支持在同一个应用中一次使用多个 GLSurfaceView。这是因为 GLSurfaceView 的每个实例都会产生自己的执行线程和 EGL 上下文,并且 Android 几乎不支持从多个线程或上下文调用 OpenGL ES。这样做是可能的,但您必须在每次 OpenGL ES 调用之前检查 EGL 上下文。这个article解释得更详细。

【讨论】:

  • 使用多个GLSurfaceView 实例应该没问题。每个人都有自己的上下文和渲染线程,所以他们不会互相干扰。人们遇到困难的地方是,如果他们试图从多个线程渲染到同一个视图中。
  • 谢谢克莱!这可以帮助我更好地理解某些事情
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
相关资源
最近更新 更多