【发布时间】: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 显示。
所以我在我的主要活动 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