关于Android端libGLESv2_mtk.so导致的崩溃问题

  • Creator 版本:3.7.3

  • 目标平台: Android

  • 重现方式:随便写个effect,使用cc_time刷新渲染,如
    vec4 fragColor = vec4(0.5sin(6.283(v_uv0.x - v_time.x + vec3(0, -0.33333, 0.33333)))+0.5, o.a);
    o *= fragColor;
    return CCFragOutput(o);

  • 首个报错:13:11:19.601 12321-12503 libc com…bet.okeysohbet A Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0 in tid 12503 (RenderThread), pid 12321 (okeysohbet:game)
    13:11:19.926 12554-12554 DEBUG pid-12554 A *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    13:11:19.926 12554-12554 DEBUG pid-12554 A Build fingerprint: ‘Redmi/dandelion/dandelion:11/RP1A.200720.011/V12.5.18.0.RCDCNXM:user/release-keys’
    13:11:19.927 12554-12554 DEBUG pid-12554 A Revision: ‘0’
    13:11:19.927 12554-12554 DEBUG pid-12554 A ABI: ‘arm’
    13:11:19.929 12554-12554 DEBUG pid-12554 A Timestamp: 2023-09-06 13:11:19+0800
    13:11:19.929 12554-12554 DEBUG pid-12554 A pid: 12321, tid: 12503, name: RenderThread >>> com.okeysohbet.okeysohbet:game <<<
    13:11:19.929 12554-12554 DEBUG pid-12554 A uid: 10239
    13:11:19.929 12554-12554 DEBUG pid-12554 A signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x0
    13:11:19.930 12554-12554 DEBUG pid-12554 A Cause: null pointer dereference
    13:11:19.930 12554-12554 DEBUG pid-12554 A r0 00068646 r1 00000000 r2 00000000 r3 00000000
    13:11:19.930 12554-12554 DEBUG pid-12554 A r4 af686008 r5 af68602c r6 00000000 r7 00000000
    13:11:19.930 12554-12554 DEBUG pid-12554 A r8 eabe12b4 r9 00000000 r10 00000000 r11 00000001
    13:11:19.930 12554-12554 DEBUG pid-12554 A ip eabdce88 sp aee6ea30 lr eab5a0e5 pc eab74600
    13:11:19.946 12554-12554 DEBUG pid-12554 A backtrace:
    13:11:19.947 12554-12554 DEBUG pid-12554 A #00 pc 0004e600 /apex/com.android.runtime/lib/bionic/libc.so (je_large_dalloc+32) (BuildId: e44bedae375b44720c6f409b54f509f4)
    13:11:19.947 12554-12554 DEBUG pid-12554 A #01 pc 000340e1 /apex/com.android.runtime/lib/bionic/libc.so (je_free+1580) (BuildId: e44bedae375b44720c6f409b54f509f4)
    13:11:19.948 12554-12554 DEBUG pid-12554 A #02 pc 000c8df5 /vendor/lib/egl/libGLESv2_mtk.so (BuildId: 72cc0c34626bcbd2841c34a3f530fd65)
    13:11:19.948 12554-12554 DEBUG pid-12554 A #03 pc 000cc8a7 /vendor/lib/egl/libGLESv2_mtk.so (BuildId: 72cc0c34626bcbd2841c34a3f530fd65)
    13:11:19.948 12554-12554 DEBUG pid-12554 A #04 pc 000ccbcd /vendor/lib/egl/libGLESv2_mtk.so (BuildId: 72cc0c34626bcbd2841c34a3f530fd65)
    13:11:19.948 12554-12554 DEBUG pid-12554 A #05 pc 000d1c57 /vendor/lib/egl/libGLESv2_mtk.so (BuildId: 72cc0c34626bcbd2841c34a3f530fd65)
    13:11:19.948 12554-12554 DEBUG pid-12554 A #06 pc 0005371f /vendor/lib/egl/libGLESv2_mtk.so (BuildId: 72cc0c34626bcbd2841c34a3f530fd65)
    13:11:19.949 12554-12554 DEBUG pid-12554 A #07 pc 0002b7d7 /vendor/lib/libsrv_um.so (BuildId: 889b1247792688ac7abc78a80e0a010b)
    13:11:19.949 12554-12554 DEBUG pid-12554 A #08 pc 000aaf93 /apex/com.android.runtime/lib/bionic/libc.so (__pthread_start(void*)+40) (BuildId: e44bedae375b44720c6f409b54f509f4)
    13:11:19.949 12554-12554 DEBUG pid-12554 A #09 pc 00064203 /apex/com.android.runtime/lib/bionic/libc.so (__start_thread+30) (BuildId: e44bedae375b44720c6f409b54f509f4)

  • 重现概率: mtk芯片100%

起因是游戏某个版本更新后,陆续有玩家反馈进不去游戏,一进就闪退,但是我们自己的测试机复现不出来,最初怀疑是代码逻辑问题,但是通过崩溃玩家的逻辑日志查不到任何问题,后来通过崩溃堆栈看到了libGLESv2_mtk.so的相关信息,又怀疑是引擎底层渲染逻辑的问题,带着这个怀疑google了一下,发现unity甚至是android原生开发也有人遇到了同样的问题。幸好同事想起来mtk这个关键词,于是去看了崩溃玩家的手机芯片是果然都是mtk的,于是找到一台mtk芯片的测试机果然复现了,通过排除法最后找到导致崩溃的原因就是某个effect使用了cc_time去动态更新,虽然定位到问题,但是没有解决办法,所以想问问论坛里的大神们。我目前是暂时去掉了cc_time相关的逻辑。

@jare 大佬帮忙看下有没有解决方案

手动顶一下

没人遇到过吗

图片
我没有上传effect的权限,就把测试的必现effect代码贴一下
// Effect Syntax Guide: https://github.com/cocos-creator/docs-3d/blob/master/zh/material-system/effect-syntax.md

CCEffect %{
  techniques:
  - passes:
    - vert: vs:vert
      frag: fs:frag
      depthStencilState:
        depthTest: false
        depthWrite: false
      blendState:
        targets:
        - blend: true
          blendSrc: src_alpha
          blendDst: one_minus_src_alpha
          blendDstAlpha: one_minus_src_alpha
      rasterizerState:
        cullMode: none
      properties:
        alphaThreshold: { value: 0.5 }
}%

CCProgram vs %{
	precision highp float;
  #include <builtin/uniforms/cc-global>
  #if USE_LOCAL
    #include <builtin/uniforms/cc-local>
  #endif
  #if SAMPLE_FROM_RT
    #include <common/common-define>
  #endif
  in vec3 a_position;
  in vec2 a_texCoord;
  in vec4 a_color;

  out vec4 v_color;
  out vec2 v_uv0;
  out vec4 v_time;

  vec4 vert () {
    vec4 pos = vec4(a_position, 1);

    #if USE_LOCAL
      pos = cc_matWorld * pos;
    #endif

    #if USE_PIXEL_ALIGNMENT
      pos = cc_matView * pos;
      pos.xyz = floor(pos.xyz);
      pos = cc_matProj * pos;
    #else
      pos = cc_matViewProj * pos;
    #endif

    v_uv0 = a_texCoord;
    #if SAMPLE_FROM_RT
      CC_HANDLE_RT_SAMPLE_FLIP(v_uv0);
    #endif
    v_color = a_color;

	v_time = cc_time;

    return pos;
  }
}%

CCProgram fs %{
	precision highp float;

	#include <builtin/internal/alpha-test>
  	#include <builtin/internal/sprite-texture>
  	#include <legacy/output>
  	#include <builtin/internal/embedded-alpha>
	#include <builtin/uniforms/cc-global>

	in vec4 v_color;
	in vec2 v_uv0;

	in vec4 v_time;

	vec4 frag () {
		vec4 o = vec4(1, 1, 1, 1);

		#if USE_TEXTURE
    		o *= CCSampleWithAlphaSeparated(cc_spriteTexture, v_uv0);
      		#if CC_USE_ALPHA_ATLAS_TEXTUREs
      			o.a *= texture2D(cc_spriteTexture, v_uv0 + vec2(0, 0.5)).r;
      		#endif
    	#endif

		o *= v_color;

		ALPHA_TEST(o);

		vec4 fragColor = vec4(0.5*sin(6.283*(v_uv0.x - v_time.x + vec3(0, -0.33333, 0.33333)))+0.5, o.a);
		o*=fragColor;
    	
    	return CCFragOutput(o);
  	}
}%

复现方法:使用cc_time刷新渲染,打出的apk包在联发科处理器的Android机上直接崩;
重现机型:Redmi 9A(M2006C3LC)、还有一些是海外用户反馈上来的手机型号,不太常见,但是一律是联发科处理器

cc_time是在global ubo里定义的?所以片元着色器可以直接使用,在顶点着色器out输出后,光栅化阶段会被插值,猜测可能会有问题

那请问大佬,我这个应该怎么改呢?

锁定只能用OpenglES2

但是3.7.3默认gles3,2是可选的。。。

C3~R2UIK)ZUMX85_T215UH 直接写在片元着色器里,不要通过顶点着色器中转试试

Creator 3.3.1 Crash On Samsung A12 (Android 11) - Cocos Creator - Cocos Forums (cocos2d-x.org)

感谢,直接在片元着色器里使用cc_time就可以了

感谢回复,已经搞定了

所以自己写的effect,cc_time都在片元着色器,但是问题还是存在,3.8.3。线上崩溃率4%。