gpt4 book ai didi

java - Android Lunar Lander 线程处理替代方案

转载 作者:太空狗 更新时间:2023-10-29 14:32:14 27 4
gpt4 key购买 nike

像许多 android 编程的新手一样,我使用 Lunar Lander 作为实现 SurfaceView 的指南。我正在通过创建一个版本的 PONG 来练习。代码的基本结构与 LunarLander 相同。显然,我很快就发现了 Lunar Lander 中的错误。我解决这个问题的直接方法是在 SurfaceCreated() 中实例化一个新的 Thread 对象并在原始线程无法启动时启动它(顺便说一下,这与很多人建议的方法相同):

我的主要问题是这是否真的是一种好的做法?实例化一个新的线程对象意味着实例化游戏所需的一切,从而使所有先前实例化的数据都挂起。如果你看看 LunarLander 本身,几乎游戏的每个核心组件都在线程中。我读过一些人们运行的话题

System.gc();

进行垃圾收集,但这通常被认为是错误的建议。

我正在尝试另一种解决方法,我不是在 SurfaceDestroyed() 中加入线程,而是直接中断它。此外,当 Activity 失去焦点时,我不会让 run() 返回,而是让它在后台完全不做任何事情,而其他一切都暂停了。我让 Activity 生命周期中的 onDestroy() 销毁一切。希望是所有数据都不需要重新实例化,而旧数据则悬而未决。这是一个合适的替代方案吗?

提前致谢。

最佳答案

如果在重新获得焦点时正确完成必要的同步,那么在失去焦点时保留线程对象当然是可能的。

但是,为了简单起见并在未获得焦点时释放资源,您可以将游戏状态提取到不属于游戏线程的类中,而是在启动时将其传递给线程,从而允许您在 surfaceDestroyed 中停止线程() 与原始代码相同。

很明显,每次您失去焦点时,线程对象都会变成垃圾,但是收集这些微不足道的字节应该不是问题。

关于java - Android Lunar Lander 线程处理替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5431590/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com