当前位置: 首页 > 知识库问答 >
问题:

为什么调用SurfaceTexture.DetachFromgLContext会删除OpenGL ES纹理对象?

鲜于阳
2023-03-14

任何人请解释为什么framework在调用detach时需要删除这个纹理对象,因为纹理是在SurfaceTexture外部创建并提供给Constructor的。因此,我希望使用纹理,即使在分离和创建者应该能够控制它的生命周期。

我们正尝试将它与附加方法和MediaCodec结合使用。在我们的用例中,我们需要复制视频帧纹理以供将来使用。

下面是创建SurfaceTexture的示例代码:

int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);
SurfaceTexture surfaceTexture = new SurfaceTexture(textures[0]);
Surface surface = new Surface(surfaceTexture);
MediaCodec videoDecoder.configure(..., surface, null, 0);
surfaceTexture.detachFromGLContext();
surfaceTexture.attachToGLContext(newTexture);

但问题是android框架删除了纹理。我的观点是它应该是一个bug,或者应该有一个删除纹理的理由。

共有1个答案

云焱
2023-03-14

每个openGL项都绑定到一个上下文,因此当它被分离时,它也必须被删除。

上下文负责创建缓冲区和处理与某个id或枚举绑定的状态(相同的事情,但枚举是预定义的)。因此,当上下文被删除时,它的所有项也会被删除。如果您有2个上下文,那么没有任何状态或缓冲区以任何方式连接,并且您对openGL所做的任何调用都将只影响当前绑定的上下文。因此分离项意味着删除它,surfaceTexture具有的唯一连接是纹理ID,该纹理ID在其他任何地方都不可用。这可能会让人困惑,但可以这样想:如果您删除了CPU对象(表面纹理)和GPU数据(纹理)之间的连接,那么纹理应该被删除,或者纹理数据成为垃圾,您就会出现内存泄漏。

很难理解为什么要将纹理从上下文中分离出来,但如果出于某种原因需要将纹理从上下文中移动,则需要另一个上下文,它是纹理的实际所有者。为此,您将需要一个共享上下文,这意味着创建一个新上下文,主上下文作为构造html" target="_blank">函数中的参数。这样,您的主上下文应该能够访问共享上下文所拥有的纹理,反过来也可以。这也允许您使用多个线程,因为“当前上下文”是每个线程。

 类似资料:
  • 我想删除至少有一个“NaN”的所有行。数据框如下图所示,但实际的数据框大约有1000004行。 完整的CSV文件:文件 我写的代码如下: 我预计至少有300000行,但我只有大约200000行。当我签入实际的CSV文件时,第一个NaN至少在第380000行之前不会出现。那么,为什么删除多余的行?

  • 我正在制作一个对象加载器,所有的纹理部分都在不同的纹理文件中。将其映射到模型上的最佳解决方案是什么?我是否需要将每个具有自己纹理的零件视为一个模型,以便最终实体具有多个单独的绘图调用,每个调用具有一个纹理?

  • 以下片段是从MDN修改而来的 请注意,我删除了之前的。当我这样做时,输出为?WTF:| 代码里甚至没有大写的“J”?到底是怎么回事???

  • 问题内容: path = “/Volumes/Users” >>> path.lstrip(‘/Volume’) ‘s/Users’ >>> path.lstrip(‘/Volumes’) ‘Users’ >>> 我期望的输出是 问题答案: 是基于字符的,它将删除该字符串中左端的所有字符。 要验证这一点,请尝试以下操作: 由于是字符串的一部分,因此将其删除。 您需要改用切片: 或者,在Python

  • 我正在编写C++来解决这个问题,从leetcode:https://leetcode.com/problems/remove-element/ 给定数组nums和值val,移除该值的所有实例并返回新的长度。 不要为另一个数组分配额外的空间,您必须用O(1)个额外内存修改输入数组。 元素的顺序可以更改。你在新长度之外留下什么并不重要。 您的函数应该返回长度=2,nums的前两个元素为2。 在返回长度

  • 根据SQL字符串组合文档,我想在postgresql数据库中执行DELETE语句: 这将导致以下错误: 另一方面,类似的execute工作正常: 我真的看不出有什么区别...