Android游戏Singleton或应用程序或两者都没有

时间:2010-11-09 02:21:52

标签: android singleton

我正在尝试学习游戏开发和Android的绳索,到目前为止它一直是一个很好的学习经验,但Android Activity Lifecycle的东西让我有点陷入困境。

假设我有三项活动 -

  • 游戏菜单
  • 等级选择
  • 实际游戏(使用SurfaceView的第2场比赛)。

我认为我需要在实际游戏活动之外加载所有位图和声音,以防止每次调用onDestroyonCreate时都必须卸载并重新加载它们,例如,当电话时进入睡眠状态,或者每次从关卡选择屏幕中选择新关卡时。

这导致我采用Singleton方法,这是有意义的,似乎是我所追求的,但我不完全明白我需要卸载Singleton以确保它获得GC,例如,我可以在游戏菜单onDestroy中发布它,如果是这样,我怎么知道游戏菜单活动是否会无限期地停留。我也看到提到Android能够自己杀死单身人士。我还阅读了一些关于使用可以给我生命周期的应用程序上下文的内容。

最好的方法是什么?我是否真的想要卸载并重新加载游戏活动中的所有资源?我是按照Singleton或Application的想法走向正确的方向吗?

4 个答案:

答案 0 :(得分:1)

不保证调用Activity的onDestroy方法(例如Task killer),所以不要依赖它。

如果您需要在整个应用程序周期中预先设置一些类,Singleton或在Application Class中引用它们也是适用的,事实上,Singleton似乎对清洁设计更有意义。

我认为你不需要明确删除你的东西,因为GC会在不需要的时候释放所有东西(至少它会在你的应用程序被android杀死之后)。此外,将这些对象附加到Game Menu的生命周期是一个坏主意。我猜你的活动想:

Game Menu Activity -> Level Selection Activity -> Main Game Activity

有时候,当您进入“主要游戏活动”时,“游戏菜单”实际上会被破坏。 (是的,如果按'后退',它将切换到新创建的游戏菜单)

答案 1 :(得分:1)

始终假设您的活动将被销毁。假设不然会让你头疼。

就我个人而言,我已经采用了将Loading和Main Game活动放在同一个方法中的方法,即在创建surfaceview时我可以在surfaceview顶部覆盖加载图形/屏幕并预加载所有位图/ on onCreate中的声音。

然后通常通过startActivityForResult从主活动中生成关卡选择和其他活动。这允许您1)在进行预加载/实例化时创建加载屏幕2)呈现具有开始游戏等的主屏幕... 3)已经创建了SurfaceView但是隐藏或隐藏在主游戏活动之后。

显然你不应该在他们开始游戏之前启动线程或任何东西,但是surfaceview本身可以准备好了。通过这种方式,Start Game无缝且快速。您只需隐藏所有其他视图并将SurfaceView置于顶部。

但是,再次,总是假设你的活动将被销毁。意思是保存游戏状态等......

关于主游戏,您应该将游戏分为2个线程 - 一个用于游戏逻辑,一个用于画布上的实际绘图。在你的游戏活动中你应该覆盖:

  • onCreate:当按下“开始游戏”按钮时,预加载位图,声音,实例化主游戏类并启动游戏线程(除了游戏逻辑线程之外的UI / Canvas)
  • onDestroy:杀死所有主题
  • onPause:暂停所有线程(应该在surfaceDestroy上杀死画布线程)
  • onResume:resume thread

始终使用可用工具分析您的应用。让您的应用程序更新线程并使用资源跟踪器跟踪它,以确保您没有使用临时对象。始终在主活动/类中创建此类对象并引用它们。我的应用程序从不运行GC,除非我告诉它并使用上述设计顺利运行。

希望这会有所帮助。我在methodin.tumblr.com写了一些关于Android游戏开发的帖子。

答案 2 :(得分:0)

Application类是存储可用于Application生命周期的信息的位置。这是放置多个活动(全局应用程序状态)使用的东西的好地方。这与使用单身基本相同。

但是,如果用户通过按回家离开应用程序,则无法保证应用程序将永久存在。如果他们在20分钟后回来,应用程序可能需要重新创建。

我不认为你需要担心GCed的问题,Android会在需要时收回内存。否则,当应用程序存在时,将会释放内容。

请务必仔细阅读Activity lifecycle上的信息。如果你去GameActivity - >等级选择 - > GameActivity,很可能不会破坏和重新创建GameActivity。相反,它将被停止并重新启动。这不是保证,但在大多数情况下都是如此。

答案 3 :(得分:0)

你自己不应该担心GC。当用户离开您的应用程序(并且暂时不返回)时,操作系统本身将负责为您处理该应用程序。

如果您想使用单例,可以在应用程序级别声明它。例如,“AssetManager”可在此处获得:

public class YourGameApplication extends Application {

    public AssetManager assetManager = new AssetManager();

    @Override
    public void onCreate() 
    {
        super.onCreate();
    }
}

然后,您可以从其他活动中调用它:

 YourGameApplication application = ((YourGameApplication ) this.getApplication());
 application.assetManager.someFunction();