【问题标题】:Android Render and Physics on separate threads?Android渲染和物理在不同的线程上?
【发布时间】:2013-01-30 15:18:50
【问题描述】:

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

我发现将它们完全分开可以让我更好地控制,现在我的精灵在所有屏幕上以所有帧速率一致地移动。

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

谢谢

【问题讨论】:

    标签: android multithreading surfaceview physics


    【解决方案1】:

    是的,使用多线程肯定会更好,尤其是在计算不重要的情况下,在这种情况下,您可能会遇到可怕的“Activity Not Responding”对话框。

    我肯定会研究的是 AsyncTasks http://developer.android.com/reference/android/os/AsyncTask.html 。本质上,您将在 doInBackground 方法(在后台线程中运行)中执行所有物理计算,然后从其中定期调用 publishProgress(这将执行“onProgressUpdate”回调,您将在其中执行所有操作你在 UI 线程上的渲染)。

    【讨论】:

    • 是的,我肯定会研究 Asnyc Task - 我不明白的一件事是,当我在单独的线程上拥有这些时,虽然速度更加一致,但精灵更多一点'choppy' - 我假设这是因为渲染可能在逻辑完成更新之前发生,有没有办法解决这个问题?
    • 嗯,我真的不能确定为什么渲染会更不稳定。您如何在后台线程和 UI 线程之间进行通信?
    • 到目前为止,我所做的只是创建一个新线程,将我所有的逻辑放入其中,并在我的 surfaceCreated() 方法中与渲染线程一起启动该线程 - 仅此而已!跨度>
    • 那么你在你的surfaceCreated()回调中产生了1个线程还是2个线程?您的渲染线程是否与您的主(UI)线程相同?另外,当您说您只是将逻辑放入一个单独的线程中时,这是否意味着您在 2 个线程之间的通信机制是共享的全局变量?如果是这样,那可能是波动的原因。
    • 我正在使用surfaceView,据我了解,它使用单独的线程进行渲染(与UI线程分开) - 所以我有3个线程。你是对的,我所有的变量都是全局的——你能告诉我为什么这可能会导致问题吗?谢谢!
    【解决方案2】:

    实际上使用不同的线程来执行逻辑和渲染 UI 真的并且总是很受欢迎。而且它也正确。

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

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

    所以最终结果是使用线程,但要小心。因为线程是有用的被最佳使用,但危险的使用不小心。

    【讨论】:

      【解决方案3】:

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

      听起来您假设通过扩展 SurfaceView,您会自动获得另一个与 UI 线程分开的 Surface 底层线程。我相信事实并非如此。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 1970-01-01
        • 2018-04-17
        • 1970-01-01
        • 2012-06-21
        • 2021-02-16
        相关资源
        最近更新 更多