【发布时间】: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