【问题标题】:Issues with GLSurface in onPause()/ onResume()onPause()/onResume() 中的 GLSurface 问题
【发布时间】:2023-03-13 19:59:01
【问题描述】:

我的 GLSurfaceView 出现问题。

我的主要活动有一个 TabLayout。我将 GLSurfaceView 放在这样的选项卡中:

    renderer = new GLRendererX(Interface.this);
    cube3d = new GLSurfaceView(Interface.this);
    cube3d.setRenderer(renderer);
    cube3d.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

    cube3d.setOnTouchListener(new OnTouch());

    cube3d_tab_content = (LinearLayout) findViewById(R.id.tab1_5);
    cube3d_tab_content.addView(cube3d);

根据 Android 开发者指南,我必须调用 onPause() 和 onResume() 方法:

当活动暂停和恢复时,必须通知 GLSurfaceView。 GLSurfaceView 客户端需要在活动暂停时调用 onPause() 并在活动恢复时调用 onResume()。这些调用允许 GLSurfaceView 暂停和恢复渲染线程,还允许 GLSurfaceView 释放和重新创建 OpenGL 显示。

Android Dev Guide

所以我在我的主要活动 onResume()/onPause() 中插入了 onResume()/onPause() 调用:

@Override
protected void onPause() {
    super.onPause();

    cube3d.onPause();
    //cube3d_tab_content.removeView(cube3d);

    currentTab = th.getCurrentTabTag();
}

@Override
protected void onResume() {
    super.onResume();

    cube3d.onResume();

    if (prefs != null) {
        protocol.refresh();
    }
    th.setCurrentTabByTag(currentTab);

    cube.setFields(ffields, rfields, lfields, ufields, dfields, bfields);

    cube.display();
}

现在,当我调用另一个活动(例如通过菜单)并返回 (onResume) 时,该活动冻结了几秒钟,最后返回到我的主要活动。

为了确保问题仅发生在 GLSurfaceView 上,我删除了有关 GLSurfaceView 的代码。它按应有的方式工作。

所以我认为我的 cube3d.onPause() / .onResume() 有问题。

有谁知道如何解决这个问题?

提前致谢!

阿德里安

【问题讨论】:

  • 我找到了一个可行的解决方案,但我不太确定这是否是正确的方法。我刚刚将初始化 GLSurfaceView 的部分移到了 onResume()。然后,当 onPause() 被调用时:cube3d_tab_content.removeAllViews(); cube3d = null; 这安全吗?

标签: android opengl-es onresume glsurfaceview onpause


【解决方案1】:

这两个方法在主线程(UI线程)中调用:YourActivity.onPause/YourGLSurfaceView.onPause

所以,在 YourGLSurfaceView.java 中可能应该是这样的:

public void onPause() {
    queueEvent(new Runnable() {
        @Override
        public void run() {
            3dcube.onPause();
        }
    });

    super.onPause();
}

【讨论】:

  • 非常感谢。我在这个问题上花了将近 4 个小时,这解决了它。
【解决方案2】:

您应该从 onpausse onresume() 方法注册/取消注册渲染器,它将完美运行

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多