0

これがAndroidの問題であるかどうかはわかりません.私はJavaを書こうとしているC ++開発者です:)

簡単に言えば問題..長くて保守が難しいスイッチケースを有限状態マシンに置き換えました。ベースコードは同じですが、約20%のパフォーマンスが低下します

より詳細な説明: アプリを拡張した後、SDK のサンプル コードに基づいて SurfaceView ベースの Android アプリを作成しました。ゲーム ループで長いスイッチ ケースを維持していることに気付きました。

一般的に、私のアプリのスケルトンは次のようになります(多くの場合)

class myView extends SurfaceView implements SurfaceHolder.Callback {
   public void update() {
      switch (_state) {
         case MENU: ... break;
         case LOAD: ... break;
         case RUN: ... break;
         ...
      }
   }

   public void draw(Canvas c) {
      switch (_state) {
         case MENU: ... break;
         case LOAD: ... break;
         case RUN: ... break;
         ...
      }
   }

   public boolean onTouchEvent(MotionEvent event) {
      switch (_state) {
         case MENU: ... break;
         case LOAD: ... break;
         case RUN: ... break;
         ...
      }
   }
}

そこで、コードをリファクタリングし、単純な有限状態マシン (FSM) を実装することにしました。

public class StateMachine {

    public State state;
    private myView context;

    public StateMachine(myView view) {
        context = view;
    state = new StateMainMenu();
}

    interface State {
        public void update();
        public void draw(Canvas canvas);
        public boolean onTouchEvent(MotionEvent event);
    }

    class StateMainMenu implements State {

    public StateMainMenu() { ... }

    @Override
    public void update() { 
            ... 
            if (windOfChange) {
               state = new StateTheNextState();
            }
        }

        @Override
    public void draw(Canvas canvas) { ... }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
            synchronized (_thread.getSurfaceHolder()) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN: ... break;
                    ...
                }
                return true;
            }
        }
    }
}

myView では、このように使用されます

class myView extends SurfaceView implements SurfaceHolder.Callback {

    private StateMachine stateMachine = new StateMachine(this);

    public void update() {
        stateMachine.state.update();
    }

    public void draw(Canvas c) {
        stateMachine.state.draw(c);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        synchronized (_thread.getSurfaceHolder()) {
            return stateMachine.state.onTouchEvent(event);
        }
    }
}

一方、州内では、同じ量のオブジェクトを作成する前に行ったこととまったく同じことを行い、アプリを実行するまったく同じコードで、フレームレートが約 20% 低下します...

理由はありますか?または私は何を間違っていますか?

4

1 に答える 1

1

私のアドバイスは、 Traceviewを使用してアプリの実行をプロファイリングし、ボトルネックとして機能している部分を特定することです。それがなければ、暗闇での撮影に少し似ています。ただし、同期ブロックに 2 セントを置きます。

于 2011-12-01T00:14:48.757 に答える