onPause()/onResume() 中 GLSurface 的问题

发布于 2025-01-04 10:42:11 字数 1660 浏览 0 评论 0原文

我的 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 开发指南

所以我插入了 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() 有问题。

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

提前致谢!

阿德里安

I'm having issues with my GLSurfaceView.

My main activity has a TabLayout. I put a GLSurfaceView inside a tab like this:

    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);

According to the Android developer guide, I have to call the onPause() and onResume() methods:

A GLSurfaceView must be notified when the activity is paused and resumed. GLSurfaceView clients are required to call onPause() when the activity pauses and onResume() when the activity resumes. These calls allow GLSurfaceView to pause and resume the rendering thread, and also allow GLSurfaceView to release and recreate the OpenGL display.

Android Dev Guide

So I insertet the onResume()/onPause() calls in my main activity onResume()/onPause():

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

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

    currentTab = th.getCurrentTabTag();
}

and

@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();
}

Now, when I call another activity - for example over the menu - and come back (onResume), the activity is freezing for a couple of seconds and finally returns to my main activity.

To make sure that the issue occurs only with GLSurfaceView I removed the code concerning the GLSurfaceView. It worked as it should.

So I assume that something is wrong with my cube3d.onPause() / .onResume().

Does anyone know how to fix this?

Thanks in advance!

Adrian

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝戈者 2025-01-11 10:42:11

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

所以,也许应该在 YourGLSurfaceView.java 中这样:

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

    super.onPause();
}

the two methods are called in main thread(UI thread): YourActivity.onPause/YourGLSurfaceView.onPause

so, maybe should like this in YourGLSurfaceView.java:

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

    super.onPause();
}
波浪屿的海角声 2025-01-11 10:42:11

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

You should register/deregister the renderer from the onpausse onresume() method and it will work perfectly

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文