和许多 Android 编程新手一样,我使用 Lunar Lander 作为实现 SurfaceView 的指南。我正在通过创建 PONG 版本来练习。代码的基本结构与LunarLander相同。显然,我很快就发现了月球着陆器中的错误。我解决这个问题的直接方法是在 SurfaceCreated() 中实例化一个新的 Thread 对象并在原始线程无法启动时启动它(顺便说一句,这与很多人建议的方法相同):
我的主要问题是这实际上是否是好的做法?实例化一个新的线程对象意味着实例化游戏所需的所有内容,从而使所有先前实例化的数据挂起。如果你看看 LunarLander 本身,几乎游戏的每个核心组件都在线程中。我读过一些人们跑步的帖子
System.gc();
进行垃圾收集,但这通常被认为是不好的建议。
我正在尝试另一种解决方法,而不是在 SurfaceDestroyed() 中加入线程,而是简单地中断它。此外,当活动失去焦点时,我不会让 run() 返回,而是让它在后台完全不执行任何操作,而其他所有操作都暂停。我让 Activity 生命周期中的 onDestroy() 销毁所有内容。希望所有数据都不需要重新实例化,而旧数据则挂起。这是一个合适的替代方案吗?
提前致谢。
只要在重新获得焦点时正确完成必要的同步,在失去焦点时保留线程对象当然是可能的。
但是,为了简单起见并在不处于焦点时释放资源,您可以将游戏状态提取到不属于游戏线程的类中,并在启动时将其传递给线程,从而允许您在 surfaceDestroyed() 中停止线程,如下所示在原始代码中完成。
显然,每次失去焦点时,线程对象都会变成垃圾,但收集这些微薄的字节应该不成问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)