java - Android游戏线程生命周期实现

标签 java android multithreading

因此,我正在为 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/

相关文章:

java - 强制扩展类设置多个值的简单方法

用于构建 SQL 前端 GUI 的 Java 库\应用程序

android - 使用 createChooser(intent title) 创建的选择器不显示标题

c - Windows 线程接受套接字上的连接

c - 段错误使用信号量来同步 C 中的 3 个线程

java - 多个线程在同一个对象上等待同步时的事件顺序

java - 如何知道用户何时关闭 Java 中使用 exec() 执行的程序

android - LUT 安卓着色器

android - 如何杀死 C (Android NDK) 中的子线程?

java - 如何引起左键单击然后关闭线程?