因为项目中的一个自定义绘图控件性能不行,改用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 来调整点的大小。