因此,我正在为 Android 开发一款新的基本 2d 游戏,并正在设置我通常使用 SurfaceView 的游戏线程实现。在打字时,我意识到,虽然这似乎可行,但我真的很想知道是否有更好的方法来实现相同的结果。以下是我现在所做工作的基础知识(对于冗长,我深表歉意,我正在尝试尽可能地压缩):
游戏 Activity 类
@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>
游戏 View
@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();
}
游戏线程类
@Override
public void run()
{
// load game state
while (this.mRunFlag) // volatile loop flag
{
// game loop
}
// save game state
}
如您所见,基本上我依靠 SurfaceHolder 的回调来管理游戏。这在方向改变等方面效果很好,但如果不问,我可能永远不知道是否可以用更好的方式实现这一点,如果有的话,我会很想知道。所以这就是我问的原因!有什么想法吗?
(之所以这么好奇是因为我几乎完全忽略了Activity的生命周期事件,感觉这可能是个问题...)
最佳答案
监听 Activity 生命周期事件可能会更好,因为 onSurfaceChanged 可能会在您意想不到的时候被调用(方向改变、某种奇怪的大小改变、VRAM 上的内存被回收,可能还有其他奇怪的情况)个)。
也就是说,对于一款游戏来说,如果表面发生变化,您可能希望对游戏进行一些重置。因此我建议同时使用两者。创建一个方法来处理所有游戏停止事件和游戏开始事件。在 onPause 和 onSurfaceDestroyed 中调用该方法(保留一个标志以确保您不会双重卸载游戏)。在 onResume 和 onSurfaceChanged 中创建你的游戏(如果它不存在)。这将提供更快的启动时间,因为它允许您的线程在渲染器准备好之前自行初始化(但不启动实际游戏。基本上将其置于就绪状态)。一旦渲染器准备就绪,游戏就可以在那一刻开始。
关于java - Android游戏线程生命周期实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3081147/