【问题标题】:Performance issue with state machine on androidandroid上状态机的性能问题
【发布时间】:2011-12-01 00:09:32
【问题描述】:

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

简单的问题.. 我已经更换了一个长而难以维护的开关盒 一个有限状态机,虽然基本代码相同,但我得到 大约 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%...

任何想法为什么?或者我做错了什么?

【问题讨论】:

    标签: android performance surfaceview state-machine fsm


    【解决方案1】:

    我的建议是使用Traceview 分析您的应用程序的执行情况,以确定它的哪一部分是瓶颈。没有它,这有点像在黑暗中拍摄。 不过,我会把我的 2 美分放在同步块上。

    【讨论】:

    • 谢谢,显然状态机不是我的瓶颈
    猜你喜欢
    • 1970-01-01
    • 2013-06-24
    • 2011-12-03
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多