2016-07-15 60 views
0

所以我正在制作一款游戏,并且有三件事情可能需要同时运行。与Android并发

showDamage - 显示片刻(〜300毫秒),则消失的数(在一个TextView)。

延迟 - 对持有临时提升。 TextView也在开始和结束时更新。这很长(〜10秒)。

冷却 - 提供了在时间的用户,直至剩余的按钮,可以再次按下文本反馈。

我做了一些浏览,并试图阻止其他事件的处理程序后,来到一般意见,我应该使用ASyncs作为一种简单的方法来使并发线程,使UI的变化和做任务,而不会阻止主线程。所以我实现了所有3个Asyncs。然后我遇到了一个问题,他们会互相干扰 - showDamage中的数字会持续超过300毫秒,临时效果将变为永久性的(post执行从未运行)。进一步的浏览表明,默认情况下,Android的池大小为5,因此我只能运行5个Asyncs。使用MyASync.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,...)会有所帮助,但它提供的并行性不是并发性。

我已经使用了CountdownTimer用于冷却和似乎已经停止发行与临时性的效果,成为永久的,但是从showDamage的TextViews如果有足够多的垃圾邮件仍然挂起。有没有解决这个问题,是否有任何尝试,我可能不正确地实施?

回答

0

你不应该有你要更新的每个组件单独异步任务。在游戏环境中,听起来你很难实现游戏循环/引擎的体系结构。

您可以使用一个线程,这可能是一个合适的Thread而不是AsyncTask,由于它的寿命长。这个想法是,你有一个单线程运行的游戏期间循环过程数据和更新用户界面。

在这些资源的例子可能是矫枉过正,因为它们直接绘制,而不是采用了android用户界面,但他们可能对于理解结构很有帮助。在你的情况下,你会想要确保你持有对你的TextView和其他元素的引用(而不是每个时间的findById)以提高效率。

Game loops, explained in incremental complexity

Long read on game loops from Game Programming Patterns textbook

Android game loop using canvas

我发现this stackoverflow answer以及this stackoverflow answer有用的理解Android中的不同的并发选项,但我想你会发现游戏引擎的资源更加有用。