5

私は現在、GLSurfaceView.Renderer を備えた GLSurfaceView を持つ顧客向けの Android アプリを作成しています。

私の OpenGL 全体は問題なく動作します (基本的には、別の開発者が最初に iOS で作成したものを移植したものです)。一つのことを除いて。ビューが読み込まれ、OpenGL が読み込まれると、背景がすばやく黒く点滅し、OpenGL が (背景とともに) 正しくレンダリングを開始します。だから私がすることは次のとおりです。

onSurfaceCreated では、次から始めます。

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
    GLES20.glClearColor(0.9f + 0.1f * (21.0f / 255),
            0.9f + 0.1f * (36.0f / 255),
            0.9f + 0.1f * (31.0f / 255), 1.0f);

    // Here goes my other stuff, if I comment all my other stuff out I still get the flash at startup
}

私の onDrawFrame メソッドでは、次のようにします。

@Override
public void onDrawFrame(GL10 gl) {

    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);

    // My stuff, again, if I comment all this stuff out I still get the flash...
}

そのため、onSurfaceCreated の glClearColor(..) を除くすべてのコード行を削除しても、実際の背景色が設定される前に黒いフラッシュが表示されます。コードから glClearColor(..) のみを削除すると (したがって、他のすべての OpenGL のものをそのままにしておくと)、すべてが黒い背景にレンダリングされます。

私が見たいのは、黒いフラッシュを取り除くだけで、起動時に背景色が正しく初期化されることです...

どうすればそれを達成できるのでしょうか?

ダーク

4

1 に答える 1

5

私はちょうど同じ問題に遭遇し、GLSurfaceView の background プロパティを使用して回避しました。ここに私のXMLがあります:

<view class="android.opengl.GLSurfaceView"
    android:id="@+id/glview"
    android:background="@drawable/window_bg"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

ここで、window_bg は、アクティビティ テーマで指定されたウィンドウの背景と同じドローアブルです。

これを行った後、 onDrawFrame() への最初の呼び出しでバックグラウンド ドローアブルを削除し、ブール値を使用して、それが既に行われているかどうかを追跡します。

boolean initialRenderHack;

//
// GLSurfaceView.Renderer
//
@Override
public void onDrawFrame(GL10 gl10) {

       // ... drawing code goes here ...

       // Remove the initial background
       if (!initialRenderHack) {
       initialRenderHack = true;
       view.post(new Runnable() {
           @Override
           public void run() {
               view.setBackgroundResource(0);
           }                
       });
    }

onDrawFrame() が実行されるレンダリング スレッドではなく、UI スレッドからのみ View の background プロパティに触れることができることに注意してください。したがって、runnable を投稿する必要があります。

Android 4.4 では、これにより、恐ろしい耳障りな黒いフレームのない、完全に滑らかな起動が実現します。古いAndroidではまだ試していません。

于 2013-12-02T11:55:42.333 に答える