You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 05:45:31