在glThread上运行长任务而不阻塞Android上的UI线程
在我的在glThread上运行长任务而不阻塞Android上的UI线程,android,multithreading,opengl-es,surfaceview,Android,Multithreading,Opengl Es,Surfaceview,在我的GLSurfaceView 这些必须在OpenGL线程上完成 然而,这会在初始化期间挂起我的主线程 这是我的密码: @Override protected void onStart() { super.onStart(); FrameLayout renderingLayout = (FrameLayout) findViewById(R.id.movie_rendering_layout); if (renderingLayout != null &&am
GLSurfaceView
这些必须在OpenGL线程上完成
然而,这会在初始化期间挂起我的主线程
这是我的密码:
@Override
protected void onStart() {
super.onStart();
FrameLayout renderingLayout = (FrameLayout) findViewById(R.id.movie_rendering_layout);
if (renderingLayout != null && mGLView == null) {
mGLView = new MyGLSurfaceView(getApplicationContext());
/** [..] **/
renderingLayout.addView(mGLView, params);
}
}
/*--------------- OPENGL RELATED ---------------*/
protected class MyGLSurfaceView extends GLSurfaceView {
private final MyGLRenderer mRenderer;
public MyGLSurfaceView(Context context) {
super(context);
// Create an OpenGL ES 1.0 context
setEGLContextClientVersion(1);
mRenderer = new MyGLRenderer();
// Set the Renderer for drawing on the GLSurfaceView
setRenderer(mRenderer);
}
}
protected class MyGLRenderer implements GLSurfaceView.Renderer {
private int mWidth, mHeight = 0;
private boolean isFinished = false;
public void onSurfaceCreated(GL10 unused, EGLConfig config) {
// Set the background frame color
GLES10.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
init(mMovieIndex, AssetsUtils.getBinPath(getApplicationContext())); // <----- THIS takes long time
}
public void onDrawFrame(GL10 pGL10) {
GLES10.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GLES10.glClear(GLES10.GL_COLOR_BUFFER_BIT);
/* [...] */
}
@覆盖
受保护的void onStart(){
super.onStart();
FrameLayout renderingLayout=(FrameLayout)findViewById(R.id.movie\u rendering\u layout);
if(renderingLayout!=null&&mGLView==null){
mGLView=newmyglsurfaceview(getApplicationContext());
/** [..] **/
renderingLayout.addView(mGLView,params);
}
}
/*---------------OPENGL相关---------------*/
受保护类MyGLSurfaceView扩展了GLSurfaceView{
私人终审法院;
公共MyGLSurfaceView(上下文){
超级(上下文);
//创建OpenGL ES 1.0上下文
setEGLContextClientVersion(1);
mrender=新的MyGLRenderer();
//设置用于在GLSURFACHEVIEW上绘制的渲染器
setRenderer(mRenderer);
}
}
受保护的类MyGLRenderer实现了GLSurfaceView.Renderer{
私有整数mWidth,mHeight=0;
私有布尔值isFinished=false;
已创建Surface上的公共void(GL10未使用,EGLConfig配置){
//设置背景框颜色
GLES10.glClearColor(0.0f,0.0f,0.0f,0.0f);
init(mMovieIndex,AssetsUtils.getBinPath(getApplicationContext());//我找到了一个解决方案:
问题是不能在onDrawFrame
或onSurfaceCreated
中阻塞,因为它们是由主线程同步调用的
要禁用调用,我在曲面构造函数中使用:
setRenderMode(RENDERMODE_WHEN_DIRTY);
这样,一旦视图解决,对onDrawFrame
的调用将停止
我从
public void onWindowFocusChanged(boolean hasFocus)
小心,它可能会被调用两次。如果有人有更好的建议,我很乐意听(摘自)
我也推翻了
@Override
public boolean isDirty()
return false;
}
不要忘记使用queueEvent
在GLThread上运行代码通常的答案是在同一共享组中创建两个EGL上下文,每个上下文绑定到一个单独的线程
渲染循环中的主线程对屏幕进行任何渲染,这在资源加载过程中通常是“无聊的”——即加载图形、进度条等
第二个线程加载背景中的任何批量资源,例如加载纹理文件、模型网格等并上载它们
加载完成后,主线程可以使用辅助异步加载线程加载的所有数据资源