2013-02-14 60 views
4

我最近有问题让我的物理学在我的渲染之前停止赛车(他们在同一个线程中),几个月后,我通过创建一个新线程并通过物理学将它解决了大约20分钟。单独的线程上的Android渲染和物理?

我发现让它们彼此完全分开给了我更大的控制力,现在我的小精灵在所有帧速率下都以所有帧速率一致地移动。

我的问题是,将逻辑和渲染放在同一个线程或单独的线程中是“更好”吗?后者似乎对我更好,但会造成任何问题吗? (如果不影响,例如电池寿命?)

谢谢

回答

0

是的,最好是使用多线程,特别是如果计算不平凡,在这种情况下,您可能会遇到可怕的“活动无响应”对话框。

我肯定会考虑的东西是AsyncTaskshttp://developer.android.com/reference/android/os/AsyncTask.html。本质上,你可以在doInBackground方法(后台线程中运行)中执行所有物理计算,然后在内部定期调用publishProgress(它将执行'onProgressUpdate'回调函数,您将在其中执行所有渲染UI线程)。

+0

是的,我会毫无疑问地看看Asnyc任务 - 我不明白的一点是,当我在不同的线程上使用这些线程时,虽然速度更一致,但是精灵有点“波涛汹涌” - 我我认为这是因为渲染可能在逻辑完成更新之前发生,有没有办法解决这个问题? – Zippy 2013-02-14 21:20:29

+0

嗯,我不能确定地说为什么渲染会更加波涛汹涌。你如何在后台线程和UI线程之间进行通信? – 2013-02-14 21:44:34

+0

我到目前为止所做的所有工作都是创建一个新线程,将所有的逻辑放入其中,并在我的surfaceCreated()方法中随同渲染线程一起启动线程 - 目前为止还没有更多! – Zippy 2013-02-14 22:44:55

0

实际使用不同的线程执行逻辑和渲染UI确实始终appreciated.and它也是正确的。

但是处理/管理多线程是程序员更难的责任。

而随着线程也增加电池消耗,所以我们应该总是使用线程非常小心。

所以最后的结果是使用线程,但仔细。因为线程有用最好使用但危险不小心使用。

0

你说...... “我使用surfaceView其按照我的理解,使用单独的线程渲染(从UI线程独立的) - 所以我有3个线程”

这听起来像你假设通过扩展SurfaceView,你会自动为Surface提供另一个基础线程,它与UI线程是分开的。我相信事实并非如此。

从Android开发人员参考SurfaceView:“此类的目的之一是提供一个辅助线程可以呈现在屏幕中的表面。” 关键词是可以是。你仍然必须自己产生单独的线程,SurfaceView只是让它更容易在单独的线程中绘制到画布上。

如果以LunarLander为例,它只有两个线程:UI线程和一个手动衍生的“LunarThread”,其中物理更新并且画布(通过SurfaceHolder.lockCanvas())被绘制到尽可能快地独立于UI线程。