Android Render和Physics在不同的线程上?

时间:2013-02-14 18:11:39

标签: android multithreading surfaceview physics

我最近遇到了让我的物理学在渲染之前停止比赛的问题(他们在同一个线程上),几个月之后,我通过创建一个新线程并将物理学放入其中来解决问题大约20分钟

我发现让它们彼此完全分离可以让我获得更大的控制权,现在我的精灵在所有帧速率下都能在所有屏幕上一致地移动。

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

谢谢

3 个答案:

答案 0 :(得分:0)

实际上,使用不同的线程来执行逻辑和呈现UI确实非常受欢迎。它也是正确的。

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

由于线程也增加了电池消耗,所以我们应该非常小心地使用线程。

所以最后的结果是谨慎使用线程。因为线程是有用的是最佳使用但危险并未仔细使用。

答案 1 :(得分:0)

是的,使用多个线程肯定会更好,特别是如果计算非常重要,在这种情况下,您可能会遇到可怕的“活动无响应”对话框。

我肯定会考虑的事情是AsyncTasks http://developer.android.com/reference/android/os/AsyncTask.html。基本上,您将在doInBackground方法(在后台线程中运行)中执行所有物理计算,然后定期从其中调用publishProgress(这将执行'onProgressUpdate'回调将在UI线程上完成所有渲染。)

答案 2 :(得分:0)

你说... “我正在使用SurfaceView,据我所知,它使用一个单独的线程进行渲染(与UI线程分开) - 所以我有3个线程”

听起来你假设通过扩展SurfaceView,你会自动为Surface提供另一个与UI线程分开的底层线程。我相信情况并非如此。

来自SurfaceView的Android开发者参考:“这个类的目的之一是提供一个辅助线程可以渲染到屏幕的表面。” 关键词是可以。您仍然必须自己生成单独的线程,SurfaceView只是使在单独的线程中绘制到画布更容易。

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