使用带有 glsurfaceview 的片段时需要了解的几件事。这有点棘手,但请留在我身边。当您导航到一个新片段时,ondestroyview 会自动使用 glsurfaceview 在您的片段上调用,这会破坏您的视图(您在 oncreateview 中创建并返回的 glsurfaceview)。
因此,当您导航到新片段时,会自动调用 onpause、onstop、ondestroyview,而无需您进行任何工作。当您使用 glsurfaceview 回到该片段时,会自动调用 oncreateview、onactivitycreated、onstart 和 onresume,而无需您进行任何工作。
您问题的关键是了解可以在 android 开发人员网站上找到的片段生命周期,以及了解 glsurfaceview 的功能。
现在,使用 glsurfaceview 您必须使用 onsurfacecreated、onsurfacechanged 和 ondrawframe 来实现渲染器。导航到另一个片段,然后使用 glsurfaceview 返回到您的片段将导致再次调用 onsurfacecreated,因为您的 glsurfaceview 在 ondestroyview 中被破坏,您的上下文已经丢失,您需要重新加载 gl 线程上的所有资源。
最后,从您的问题来看,没有调用 ondrawframe,这可能是由于您没有重新创建视图、设置渲染器并从 oncreateview 返回视图。
所以在 oncreateview 你需要这样的东西
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle
savedInstanceState)
{
View mView = inflater.inflate(R.layout.fragment_layout, null);
surface = (GLSurfaceView) mView.findViewById (R.id.glsurfaceview);
surface.setEGLContextClientVersion(2);
//return your view here
return mView;
}
@Override
public void onActivityCreated(Bundle mState)
{
super.onActivityCreated(mState);
//setting your renderer here causes onSurfaceCreated to be called
//if you set your renderer here then you have a context to load resources
surface.setRenderer( shader );
}
您不想在 oncreateview 中创建渲染类(着色器),除非您希望每次使用 glsurfaceview 回到片段时都“重新开始”渲染类。相反,在您的 Fragments onCreate 中创建您的渲染类,这样,如果您设置了一些东西,那么您将从您离开的地方开始,因为只需设置渲染器将为您提供表面,这将导致 onsurfacecreated、onsurfacechanged 和 ondrawframe 被调用自动地。在绘制它们之前,请确保在 ondrawframe 中重新加载上次在 onsurfacecreated 中使用的任何资源。
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
shader = new Shader(this);
Log.d("Fragment", "OnCreate");
}
当涉及到暂停和恢复片段时,在大多数情况下,当您动态替换片段并将其添加到后台堆栈时,这会自动处理,因此只需将 surface.onpause() 和 surface.onResume() 放在正确的位置你很高兴。
为了让事情变得清晰,尝试将日志语句放在围绕片段生命周期和 glsurfaceview 渲染器的方法中,您将能够看到发生了什么和没有发生什么。