5

在我的 openGL 游戏中,我通常使用 onDrawFrame() 中的 GLSurfaceView.Renderer 类来绘制场景。但是,当我显示加载屏幕时,我想在加载每个数据项后强制屏幕绘制,以便显示加载栏。

是否可以在此绘制调用期间以某种方式强制进行缓冲区交换?我唯一的选择是在多个帧之间错开加载,这意味着大量的返工..

我想我要调用的是 eglSwapBuffers() 但我找不到从 GLSurfaceView 或 GLSurfaceView.Renderer 访问 egl 上下文的方法。

感谢您的时间。

4

4 回答 4

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 中。

于 2012-09-29T20:51:36.303 回答
4

不,您不能(或不应该)在渲染器的 onDraw 方法中强制交换缓冲区。

您应该做的是在单独的线程中加载数据。您的 onDraw 方法仍将被定期调用,这将让您向加载线程询问加载了多少项目以相应地显示进度条/消息。

于 2011-06-24T08:38:16.157 回答
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 ) );
    }

    ...
}
于 2012-06-01T19:04:17.850 回答
0

一个强制的解决方案是根据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公开您可以使用EglHelper.swap方法。

public static class EglHelper {
于 2021-03-24T13:46:14.103 回答