Android OpenGl Renderer完成活动

时间:2013-11-04 15:51:09

标签: android opengl-es renderer glsurfaceview

在OpenGL Renderer中多次调用onDrawFrame,直到页面完全呈现。我无法找到一个事件,我的页面已完成呈现,以便拍摄OpenGL页面的快照并为其设置动画。

我有解决方案在动画触发器(特定按钮)上拍摄快照,但这意味着特定的延迟,直到创建了Bitmap,例如我想在内存中保留每个页面的可变副本。 / p>

您是否了解使用渲染内容为GLSurfaceView制作动画的其他方法?

用于触发快照的代码段。

 glSurfaceView.queueEvent(new Runnable() {

                @Override
                public void run() {
                    glSurfaceView.getRenderer().takeGlSnapshot();
                }
            });

用于传递GL11对象的EGLContext。

    public void takeGlSnapshot() {
         EGL10 egl = (EGL10) EGLContext.getEGL();
         GL11 gl = (GL11) egl.eglGetCurrentContext().getGL();
         takeSnapshot(gl);

}

onDrawFrame(Gl10 gl) {
 //is last call for this page event ???????????? 

1 个答案:

答案 0 :(得分:2)

不存在此类事件,我将在下面解释。

OpenGL被设计为客户端/服务器架构,两者以异步方式运行。在现代实现中,您通常可以将客户端视为用于发出命令的API前端,将服务器视为GPU /驱动程序后端。 API调用将在确认输入参数等方面做一些工作,但除了少数例外(如glReadPixels (...))之外,它们还会缓存服务器稍后执行的命令。除非明确调用glFinish (...)

,否则您永远不会真正知道命令何时完成

在每个帧结束时调用glFinish (...)是一个糟糕的主意,因为它将创建CPU / GPU同步点并撤消使CPU和GPU异步运行的好处。但是,如果您只想偶尔拍摄当前框架的屏幕截图,那么glFinish (...)可能是一种可接受的做法。

另一件需要考虑的事情是,如果您使用双缓冲渲染,则可以访问 最后 完全渲染帧通过读取前缓冲区。然而,这是特定于实现的行为,因为一些系统被设计为在缓冲器交换操作之后丢弃前缓冲器的内容,而其他系统则使其内容读取未定义的操作。在任何情况下,如果您尝试此解决方案,请注意返回的图像将具有1帧延迟(但是,读取它的过程不需要您完成当前帧),这可能是不可接受的。