gpt4 book ai didi

android - 将 SurfaceView 表面从 Canvas 切换到 OpenGL 后的 EGL_BAD_ALLOC

转载 作者:行者123 更新时间:2023-11-29 01:11:48 29 4
gpt4 key购买 nike

在使用 eglCreateWindowSurface() 绘制后,我无法将 Surface 锁定到 EGL(使用 Surface.lockCanvas(null))即使我用 Surface.unlockCanvasAndPost() 发布了它

错误代码:

EGLNativeWindowType 0x61dff830 already connected to another API
eglCreateWindowSurface:414 error 3003 (EGL_BAD_ALLOC)

我不需要在表面上保留 Canvas 完成的绘图,我只需要能够更新 SurfaceView浮出水面并展示它

如果我在使用 EGL 之前不绘制到 Surface,它会按预期工作,并且如果我只输入:

Canvas c = mSurface.lockCanvas(null);
c.drawColor(Color.RED);
mSurface.unlockCanvasAndPost(c);

...我收到这个错误

这是预期的行为吗?这发生在真实设备 4.1.2 和 AVD API25 上

有没有办法从 Canvas 绘图中完全解锁 Surface(必要时甚至使用原生)?

反之亦然(EGL 到 Canvas)

TextureView 相同的行为

解决方法:

如果在我的TextureView我销毁本地 Surface 对象并从相同的 SurfaceTexture 重新创建它由以前的 Surface 拥有 new Surface(mOldSurfaceTexture) ,错误不会出现。

最佳答案

如官方文档所述,这是预期的行为

When you lock a Surface for Canvas access, the "CPU renderer" connects to the producer side of the BufferQueue and does not disconnect until the Surface is destroyed. Most other producers (like GLES) can be disconnected and reconnected to a Surface, but the Canvas-based "CPU renderer" cannot. This means you can't draw on a surface with GLES or send it frames from a video decoder if you've ever locked it for a Canvas.

https://source.android.com/devices/graphics/arch-sh.html#canvas

所以唯一的方法是使用我在问题中发布的解决方法

---------------- 编辑:----------------

我找到了另一种方法:如果您需要使用 Canvas 进行绘图,则必须创建一个 EGL/OpenGL 上下文,以及一个 Canvas 来自 Bitmap(您必须创建与表面尺寸相同的位图,所以你可以绘制到这个 Canvas 上,将位图加载为 opengl 纹理并从 OpenGL 中绘制

关于android - 将 SurfaceView 表面从 Canvas 切换到 OpenGL 后的 EGL_BAD_ALLOC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42446442/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com