1

現在、私は自分ApplicationActivityのを持っています。このアクティビティは、複数のビューを管理する責任があります(GLSurfaceViews)。すべてのビューでレンダラーを「グローバル」レンダラーに設定できますか?

コード:

public class ApplicationActivity extends Activity 
{
    private static final String TAG = ApplicationActivity.class.getSimpleName();

    private final Stack<Screen> screens = new Stack<Screen>();
    private GlRenderer glRenderer;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);

            Log.d(TAG, "Main Activity Created");

        setupGraphics();

        ChangeScreen(new MainMenu(this, glRenderer)); //Creating a new Screen sets the renderer
    }

    private void setupGraphics()
    {
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,     WindowManager.LayoutParams.FLAG_FULLSCREEN);

        glRenderer = new GlRenderer(this);
    }


    public void Draw() //Is called by the glRenderer onDrawFrame() { mainActivity.Draw() } 
    {

    }
}

同じアクティビティを切り替えGLSurfaceViewsて、私の知る限り、このメソッドsetRendererはビューレンダラーを設定してから、レンダリングスレッドを開始すると思います(新しいスレッドを作成します)が、ビューを切り替えるたびにスレッドを再作成したくありません-作成する可能性があります潜在的な問題。

したがって、最終的には、グラフィックをビジネスロジックなどから分離するためだけに、レンダラークラスが必要ですが、スレッドを再度設定しなくても、1つのレンダラーを使用できるかどうかはわかりません。

4

2 に答える 2

1

GLSurfaceView.onPause()/で適切に切り替えた場合にのみ、同じレンダラーで複数のビューを使用できます.onResume();

私の特定のケース:

@Override
protected void onPause() //Overrides onPause from Activity
{
    surfaceViews.peek().onPause();
    super.onPause();
}

したがって、アクティビティが一時停止するたびに、現在のビューを一時停止する必要があります。アクティビティが再開した場合は、ビューも再開します。

SetViewまた、(一時停止して削除してから別のビューに変更する) または (一時停止してから別のビューに変更する)というメソッドがあります。Stack

public void SetView(View screen)
{   
    if (!screens.empty())
    {
        screens.peek().onPause();
        screens.pop();
    }

    screens.push(screen);
    setContentView(screens.peek());
}

もちろん、アクティビティの代わりにビューを使用しているためonBackPressed()、以前のビューに戻るには をオーバーライドする必要があります。

@Override
public void onBackPressed() 
{       
    if (screens.size() == 1)
        super.onBackPressed();
    else
    {
        screens.pop();
        setContentView(screens.peek());
        screens.peek().onResume();
    }
}
于 2012-08-28T17:52:00.610 に答える
0

そうすることで、クラスのnew GLRenderer()新しいインスタンスを作成します。したがって、異なるアクティビティで同じレンダラーを使用しても問題ありません。

編集:私はあなたの質問を誤解しているようです-一度に多くのGLサーフェスを表示したい場合は、いいえ、それは不可能です。しかし、レンダラー コードの再利用とは何の関係もありませんでした。

于 2012-08-25T23:42:43.230 に答える