在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 ????????????
答案 0 :(得分:2)
不存在此类事件,我将在下面解释。
OpenGL被设计为客户端/服务器架构,两者以异步方式运行。在现代实现中,您通常可以将客户端视为用于发出命令的API前端,将服务器视为GPU /驱动程序后端。 API调用将在确认输入参数等方面做一些工作,但除了少数例外(如glReadPixels (...)
)之外,它们还会缓存服务器稍后执行的命令。除非明确调用glFinish (...)
。
在每个帧结束时调用glFinish (...)
是一个糟糕的主意,因为它将创建CPU / GPU同步点并撤消使CPU和GPU异步运行的好处。但是,如果您只想偶尔拍摄当前框架的屏幕截图,那么glFinish (...)
可能是一种可接受的做法。
另一件需要考虑的事情是,如果您使用双缓冲渲染,则可以访问 最后 完全渲染帧通过读取前缓冲区。然而,这是特定于实现的行为,因为一些系统被设计为在缓冲器交换操作之后丢弃前缓冲器的内容,而其他系统则使其内容读取未定义的操作。在任何情况下,如果您尝试此解决方案,请注意返回的图像将具有1帧延迟(但是,读取它的过程不需要您完成当前帧),这可能是不可接受的。