Android OpenGL ES踩坑记录

因为项目中的一个自定义绘图控件性能不行,改用OpenGL实现,也是第一次使用OpenGL,由于只是绘制2D图形,参考官方以及网上的教程,实现起来还是比较顺畅的,开发时只用了两个手机测试,运行良好,性能达标,结果换其他手机测试,闪退!!!各种搜索,也没有搜到有相关经验的文章,懵了,后面修复这个闪退花费了10天,看闪退日志像是骁龙处理器驱动问题,APP调用 glDrawArrays 就闪退:

2023-11-07 17:45:20.469 17944-17944 DEBUG                    A  signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A  Cause: null pointer dereference
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A      x0  00000071d37180e0  x1  0000000000000000  x2  0000000000000040  x3  00000071e2d8a790
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A      x4  0000000000000040  x5  00000071d3718120  x6  0000000000000010  x7  0000000000000000
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A      x8  0000000000000000  x9  000000000000003f  x10 0000000000000040  x11 0000000000000004
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A      x12 0000000000000010  x13 b400007352c12fb8  x14 0000000000000040  x15 b400007432b52050
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A      x16 000000723c16caf0  x17 000000752c86a820  x18 00000071daa72000  x19 b40000728eb73290
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A      x20 0000000000000004  x21 000000000000002c  x22 0000000000000001  x23 00000071d37180c0
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A      x24 b4000072d4b4d640  x25 0000000000000020  x26 b40000728eb732ac  x27 b400007360b3d370
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A      x28 b400007352c12fd8  x29 00000071e2d8a9b0
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A      lr  000000723c1250b4  sp  00000071e2d8a6c0  pc  000000752c86a6d0  pst 0000000080001000
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A  backtrace:
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A        #00 pc 000000000004d6d0  /apex/com.android.runtime/lib64/bionic/libc.so (__memcpy+32) (BuildId: 0ae8741b5e25fc676164a0da53a77631)
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A        #01 pc 00000000003d60b0  /vendor/lib64/egl/libGLESv2_adreno.so (!!!0000!f56be09eb88f86833124f1df42e945!8699000cd8!+11640) (BuildId: e877ac50f8aa780773379056a8a6fc9e)
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A        #02 pc 00000000001bb454  /vendor/lib64/egl/libGLESv2_adreno.so (!!!0000!6b200851123c7898055fe62ff9f71f!8699000cd8!+2388) (BuildId: e877ac50f8aa780773379056a8a6fc9e)
2023-11-07 17:45:20.469 17944-17944 DEBUG                    A        #03 pc 00000000001a0c14  /vendor/lib64/egl/libGLESv2_adreno.so (!!!0000!28254c066fd778faffa7894b1bd8b1!8699000cd8!+196) (BuildId: e877ac50f8aa780773379056a8a6fc9e)

看到这些log,差点以为无解了,后面改用VAO VBO去加载顶点数据,哎呀!好了!

具体实施方式就是把

GLES30.glVertexAttribPointer(positionHandle, 2, GLES30.GL_FLOAT, false, 0, vertexBuffer)

替换成

GLES30.glBindBuffer(GLES30.GL_ARRAY_BUFFER, buffer)
GLES30.glBufferData(GLES30.GL_ARRAY_BUFFER, vertexBuffer.capacity() * 4, vertexBuffer, GLES30.GL_STATIC_DRAW)
GLES30.glVertexAttribPointer(positionHandle, 2, GLES30.GL_FLOAT, false, 0, 0)

还有个小插曲,就是画点的时候有些手机设置 glLineWidth 可以调整点的大小,有些手机不行,以至于本人以为这些手机画不出点来,这种情况得在着色器代码中使用专用的 gl_PointSize 来调整点的大小。

你可能感兴趣的:(OpenGL,Android开发,android,opengl,es)