0

onResume を取得すると、EGL と GLES の状態を最初から再作成するという問題が発生していますが、何も描画されません。重要なコードは、最初の作成と再開のコードで同じです。私は現在、これを引き起こす可能性のあるものについて困惑しています。私の EGL サーフェスの最初の作成と表示で、物事は完全に機能します。アプリが再開されたとき (ホームボタンを押してからアプリに戻る) のみ、何も表示されません。他のすべてが正常に動作していること、入力が受信されていること、および Android コールバックが通常どおりに発生していることを確認しました (dalvik スレッドまたはレンダリング スレッドでのブロックまたはロックアップはありません)。EGL と GLES の状態は完全に破棄され、onPause と onResume の間で再作成されます。

4

1 に答える 1

2

私がしていることは、アプリの起動時または必要なときに、すべての 3D モデルの頂点、テクスチャなどをメモリ (GL ハンドルではない) にロードすることです。

openGL-es 1.1 で書かれた比較的単純なゲーム アプリがあります (照明、シェーダー、パーティクルなどはなく、テクスチャ モデルのみ)。事前に openGL ハンドルにロードする必要があるのは、テクスチャだけです。これは、ロードに時間がかかるためです。他のすべては、レンダラーの onDraw メソッドで実行時に実行できます。

したがって、私のコードは次のようになります。

@override
public void onPause(){

    findViewById(R.id.loading_screen).setVisibility(View.VISIBLE); 

}

@Override
public void onResume(){
    super.onResume();

    findViewById(R.id.loading_screen).setVisibility(View.VISIBLE);

    myRenderer.reLoadTextures();   

    findViewById(R.id.loading_screen).setVisibility(View.GONE);     
}

@Override
public void onRestart(){
    super.onRestart();

    findViewById(R.id.loading_screen).setVisibility(View.VISIBLE);

    myRenderer.reLoadTextures();

    findViewById(R.id.loading_screen).setVisibility(View.GONE); 
}

class MyRenderer implements Renderer{

    private HashMap<String,Texture> textures;
    private boolean reloadTextures = false;

    // flag to the renderer that textures need to be reloaded
    public void reLoadTextures(){
        reloadTextures = true;
    }

    public void onDraw(GL10 gl){

        if(reloadTextures){

            // loop through hashmap and reload textures
            Iterator it = textures.entrySet().iterator();
            while(it.hasNext()){
                Entry set = it.next();
                set.getValue().loadTexture(gl, set.getKey(), context);
            }

            reloadTextures = false;
        }

        // draw models as normal

    }

}

...これはあなたが本当に探しているものではないことはわかっています。このようにすると、GL の状態が破棄されても問題ありません。Android は、アプリを初めて起動したかのように、新しい GL 状態を自動的に提供します。また、Renderer を実装するだけで、SurfaceView を拡張する必要がないことも意味します。

これは単純化されたバージョンであり、スレッド化を考慮すると、より複雑になります。アプリ/アクティビティが再開された後もTexture.loadTexture()、モデルが使用する参照と取得する ID が一致することを確認するための少しの作業もあります。glGenTextures

また、android:screenOrientation="landscape"マニフェスト ファイルにある場合は、向きの変更を処理するようにしてください。私の電話の場合のように、ホーム画面とロック画面は常に縦向きで、アプリの再開時に向きが違う。オーバーライドしないonConfigurationChange()と、再ロードした場合でも GLSurfaceView で問題が発生する可能性があります (一部のテクスチャが表示されないなど)。onResume

于 2011-12-07T19:44:59.370 に答える