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 に答える