EGL_BAD_ALLOC 将 SurfaceView Surface 从 canvas 切换到 opengl 后
EGL_BAD_ALLOC after switching SurfaceView Surface from canvas to opengl
如标题所述,即使我使用 Surface.unlockCanvasAndPost()
[=21= 释放它,在使用 Surface.lockCanvas(null)
绘制到它之后,我也无法将 Surface 锁定到 EGL(使用 eglCreateWindowSurface) ]
错误代码:
EGLNativeWindowType 0x61dff830 already connected to another API
eglCreateWindowSurface:414 error 3003 (EGL_BAD_ALLOC)
我不需要在表面上保留 canvas 完成的绘图,我只需要能够更新 SurfaceView
表面并显示它
如果我不在 Surface 上绘制,在使用 EGL 之前它会正常工作,如果我只把
Canvas c = mSurface.lockCanvas(null);
c.drawColor(Color.RED);
mSurface.unlockCanvasAndPost(c);
我收到这个错误
这是预期的行为吗?这在真实设备 4.1.2 和 AVD API25
上都会发生
有没有办法从 Canvas 绘图中完全解锁 Surface(必要时甚至使用原生)?
相反的方法有效(EGL 到 Canvas)
--------编辑-------------
与 TextureView
相同的行为
---------解决方法-------------
如果在我的 TextureView
中我销毁了本地 Surface object 并从前一个 Surface 拥有的相同 SurfaceTexture
和 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
上下文,并从 Bitmap
(你必须创建相同大小的表面,
所以你可以画到这个 canvas,将位图加载为 opengl 纹理并从 OpenGL
绘制它
如标题所述,即使我使用 Surface.unlockCanvasAndPost()
[=21= 释放它,在使用 Surface.lockCanvas(null)
绘制到它之后,我也无法将 Surface 锁定到 EGL(使用 eglCreateWindowSurface) ]
错误代码:
EGLNativeWindowType 0x61dff830 already connected to another API
eglCreateWindowSurface:414 error 3003 (EGL_BAD_ALLOC)
我不需要在表面上保留 canvas 完成的绘图,我只需要能够更新 SurfaceView
表面并显示它
如果我不在 Surface 上绘制,在使用 EGL 之前它会正常工作,如果我只把
Canvas c = mSurface.lockCanvas(null);
c.drawColor(Color.RED);
mSurface.unlockCanvasAndPost(c);
我收到这个错误
这是预期的行为吗?这在真实设备 4.1.2 和 AVD API25
上都会发生有没有办法从 Canvas 绘图中完全解锁 Surface(必要时甚至使用原生)?
相反的方法有效(EGL 到 Canvas)
--------编辑-------------
与 TextureView
---------解决方法-------------
如果在我的 TextureView
中我销毁了本地 Surface object 并从前一个 Surface 拥有的相同 SurfaceTexture
和 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
上下文,并从 Bitmap
(你必须创建相同大小的表面,
所以你可以画到这个 canvas,将位图加载为 opengl 纹理并从 OpenGL