在我的openGL游戏中,我通常使用onDrawFrame()中的GLSurfaceView.Renderer类来绘制场景。但是,当我显示加载屏幕时,我想在加载每个数据项后强制屏幕绘制,以便显示加载栏。
是否有可能以某种方式在此绘制调用期间强制执行bufferswap?我唯一的选择是在多个框架上错开装载,这意味着需要进行大量的返工。
我想我想要调用的是eglSwapBuffers(),但我找不到从GLSurfaceView或GLSurfaceView.Renderer访问egl上下文的方法。
感谢您的时间。
答案 0 :(得分:5)
您也可以将此方法添加到GLSurfaceView.Renderer类:
import javax.microedition.khronos.egl.EGL10;
import javax.microedition.khronos.egl.EGLDisplay;
import javax.microedition.khronos.egl.EGLSurface;
public void swapBuffers()
{
EGL10 curEgl = (EGL10)EGLContext.getEGL();
EGLDisplay curDisplay = curEgl.eglGetCurrentDisplay();
if (curDisplay == EGL10.EGL_NO_DISPLAY) { Log.e("myApp","No default display"); return; }
EGLSurface curSurface = curEgl.eglGetCurrentSurface(EGL10.EGL_DRAW);
if (curSurface == EGL10.EGL_NO_SURFACE) { Log.e("myApp","No current surface"); return; }
curEgl.eglSwapBuffers(curDisplay, curSurface);
}
与OpenUserX03的答案大致相同,只是在Java中。
答案 1 :(得分:4)
不,您不能(或不应该)强制在渲染器的onDraw方法中交换缓冲区。
您应该做的是在单独的线程中加载数据。您的onDraw方法仍将定期调用,这样您就可以向加载线程询问有多少项目可以相应地显示进度条/消息。
答案 2 :(得分:1)
已经有一段时间了,因为答案已被接受,但您可以(并且没有理由不应该)强制在渲染器的onDrawFrame()方法中交换缓冲区。
我在OpenGL应用程序中遇到了完全相同的问题 - 我需要在加载数据时渲染加载屏幕。这是我在加载期间调用eglSwapBuffers()的伪代码示例(我使用JNI):
public void onDrawFrame(GL10 gl)
{
MyJNILib.render();
}
MyJNILib原生伪代码:
#include <EGL\egl.h>
...
void render()
{
...
while (loading)
{
// Do loading stuff
...
eglSwapBuffers( eglGetCurrentDisplay(), eglGetCurrentSurface( EGL_DRAW ) );
}
...
}
答案 3 :(得分:0)
强制的解决方案是根据 the source code of Android 制作自定义版本的 GLSurfaceView 类。
在源码中可以找到一个名为swap
的方法:
/**
* Display the current render surface.
* @return the EGL error code from eglSwapBuffers.
*/
public int swap() {
if (! mEgl.eglSwapBuffers(mEglDisplay, mEglSurface)) {
return mEgl.eglGetError();
}
return EGL10.EGL_SUCCESS;
}
这应该是你想要的。然而不幸的是,它是一个名为 EglHelper
的私有内部类的方法。
/**
* An EGL helper class.
*/
private static class EglHelper {
因此,在您的自定义 GLSurfaceView 类(从 Google 的源代码中复制)中,将此 EglHelper
类设为 public,然后您就可以使用 EglHelper.swap
方法。
public static class EglHelper {