Android游戏线程生命周期实现

时间:2010-06-20 22:14:41

标签: java android multithreading

所以我正在开发一款适用于Android的新的基本2D游戏,并且正在设置我使用SurfaceView的游戏线程的常规实现。在打字的时候,我意识到,虽然这似乎有效,但我真的想知道是否有更好的方法来实现相同的结果。以下是我现在所做的基础知识(我为冗长而道歉,我尽量压缩):

GameActivity类

@Override
public void onCreate(final Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    this.setContentView(R.layout.game);

    this.mGameView = (GameView)this.findViewById(R.id.gameview);
}

XML布局

<?xml version="1.0" encoding="utf-8" ?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
 <com.package.name.GameView
    android:id="@+id/gameview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:focusable="true"
        android:focusableInTouchMode="true" />
</merge>

GameView

@Override
public void surfaceCreated(final SurfaceHolder holder) { }

@Override
public void surfaceChanged(final SurfaceHolder holder, final int format, 
                            final int width, final int height)
{
    this.mGameThread = new GameThread(this.getContext(), holder, 
                                        width, height);

    this.mGameThread.start(); // starts the game
}

@Override
public void surfaceDestroyed(final SurfaceHolder holder)
{
    // flips volatile flag stopping execution
    // then calls .join()
    this.mGameThread.release(); 
}

GameThread类

@Override
public void run()
{
    // load game state
    while (this.mRunFlag) // volatile loop flag
    {
        // game loop
    }
    // save game state
}

正如您所看到的,基本上我依靠SurfaceHolder的回调来管理游戏。这种方法很有效,因为方向改变等等,但没有问,我可能永远不知道这是否可以以更好的方式实现,如果有的话,我会急于学习。所以这就是我要问的原因!有什么想法吗?

(我很好奇的原因是因为我几乎完全忽略了Activity的生命周期事件,觉得这可能是个问题......)

1 个答案:

答案 0 :(得分:1)

听一下活动生命周期事件可能会更好,因为onSurfaceChanged可以在你不期望的时候被调用(方向改变,某种奇怪的大小改变,VRAM上的内存被回收,可能还有其他奇怪的那些)。

也就是说,如果表面发生变化,您可能希望重置游戏。因此我建议同时使用两者。创建一个方法来处理所有游戏停止事件和游戏开始事件。在onPause和onSurfaceDestroyed中调用该方法(保持一个标志以确保你不会双重卸载你的游戏)。在onResume和onSurfaceChanged中创建你的游戏,如果它不存在。这将提供一些更快的启动时间,因为它将允许您的线程初始化自己(但不启动实际游戏。基本上将其置于就绪状态),然后渲染器就绪。一旦渲染器准备就绪,游戏就可以在那一瞬间开始。

相关问题