0

不确定这是一个 android 问题,我是一名 C++ 开发人员,正在尝试编写 java :)

简而言之问题..我用有限状态机替换了一个长而难以维护的开关盒,虽然基本代码相同,但我得到了大约 20% 的性能损失

一些更详细的解释:在扩展我的应用程序后,我根据 SDK 中的示例代码创建了一个基于 SurfaceView 的安卓应用程序我发现自己在我的游戏循环中维护了很长的开关案例

通常我的应用程序骨架看起来像这样(很多情况下)

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 回答