Android 13中Fragment内GlSurfaceView恢复时UI冻结问题求助
问题描述
我有两个均包含GLSurfaceView的Fragment:第一个Fragment的按钮可导航至第二个Fragment,第二个Fragment的按钮可返回第一个。两者的GLSurfaceView使用同一种Renderer,该Renderer仅实现背景颜色渐变功能。
异常表现
- 处于第二个Fragment时,切换到其他应用再切回,整个UI会冻结;但第一个Fragment无此问题,尽管两者逻辑几乎完全一致。
- 该问题**仅在Android 13(SDK 33)**中出现,Android 12和14可正常运行。
触发条件
- Renderer每帧执行50万次
gl.glClearColor操作时才会触发;若仅执行1次则无问题。 - 通过带动画的Fragment导航进入第二个Fragment时才会触发;无动画导航则正常运行。
代码实现
Renderer代码
public final class OpenGLRenderer implements Renderer { public void onSurfaceCreated(GL10 gl, EGLConfig config) { } public void onSurfaceChanged(GL10 gl, int w, int h) { gl.glViewport(0, 0, w, h); } float color = 0.2f; public void onDrawFrame(GL10 gl) { gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); color += 0.01f; if (color > 0.7) { color = 0.02f; } for(int i = 0; i < 500000; i++) { gl.glClearColor(color * 0.8f, 0.0f, color, 1.0f); } } }
第一个Fragment代码
public class FirstFragment extends Fragment { private FragmentFirstBinding binding; @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) { binding = FragmentFirstBinding.inflate(inflater, container, false); return binding.getRoot(); } public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); binding.OpenGlGameGraphics.setRenderer(new OpenGLRenderer()); binding.buttonFirstWithAnimation.setOnClickListener(view1 -> { FragmentManager manager = getParentFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); ft.replace(R.id.FragmentMain, new SecondFragment()); ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); ft.addToBackStack(null); ft.commit(); }); binding.buttonFirstNoAnimation.setOnClickListener(view1 -> { FragmentManager manager = getParentFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); ft.replace(R.id.FragmentMain, new SecondFragment()); ft.addToBackStack(null); ft.commit(); }); } @Override public void onResume() { super.onResume(); binding.OpenGlGameGraphics.onResume(); } @Override public void onPause() { super.onPause(); binding.OpenGlGameGraphics.onPause(); } @Override public void onDestroyView() { super.onDestroyView(); binding = null; } }
第二个Fragment代码
public class SecondFragment extends Fragment { private FragmentSecondBinding binding; @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) { binding = FragmentSecondBinding.inflate(inflater, container, false); return binding.getRoot(); } public void onViewCreated(@NonNull View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); binding.OpenGlGameGraphics.setRenderer(new OpenGLRenderer()); binding.buttonSecond.setOnClickListener(view1 -> { FragmentManager manager = getParentFragmentManager(); manager.popBackStack(); }); } @Override public void onResume() { super.onResume(); binding.OpenGlGameGraphics.onResume(); } @Override public void onPause() { super.onPause(); binding.OpenGlGameGraphics.onPause(); } @Override public void onDestroyView() { super.onDestroyView(); binding = null; } }
内容的提问来源于stack exchange,提问作者PEK
相关产品推荐
相关产品推荐

