我最近遇到了让我的物理在渲染之前停止比赛的问题(它们在同一个线程上),几个月后,我通过创建一个新线程并将物理放入其中,在大约 20 分钟内解决了这个问题。
我发现将它们完全分开可以让我更好地控制,现在我的精灵在所有屏幕上以所有帧速率一致地移动。
我的问题是,将逻辑和渲染放在同一个线程或单独的线程中是否“更好”?后者对我来说似乎更好,但它会导致任何问题吗?(例如是否会影响电池寿命?)
谢谢
我最近遇到了让我的物理在渲染之前停止比赛的问题(它们在同一个线程上),几个月后,我通过创建一个新线程并将物理放入其中,在大约 20 分钟内解决了这个问题。
我发现将它们完全分开可以让我更好地控制,现在我的精灵在所有屏幕上以所有帧速率一致地移动。
我的问题是,将逻辑和渲染放在同一个线程或单独的线程中是否“更好”?后者对我来说似乎更好,但它会导致任何问题吗?(例如是否会影响电池寿命?)
谢谢
实际上,使用不同的线程来执行逻辑和渲染 UI 真的而且总是很受欢迎。而且它也是正确的。
但是处理/管理多线程是程序员更难的责任。
而且由于线程也会增加电池消耗,所以我们应该始终非常小心地使用线程。
所以最终的结果是使用线程,但要小心。因为线程是有用的被最佳使用,但危险的使用不小心。
是的,使用多个线程肯定会更好,尤其是在计算不重要的情况下,在这种情况下,您可能会遇到可怕的“活动无响应”对话框。
我肯定会研究的东西是AsyncTasks
http://developer.android.com/reference/android/os/AsyncTask.html。本质上,您将在方法中执行所有物理计算doInBackground
(在后台线程中运行),然后定期publishProgress
从该方法中调用(这将执行“onProgressUpdate”回调,您将在 UI 线程上进行所有渲染)。
你说......“我正在使用surfaceView,据我所知,它使用单独的线程进行渲染(与UI线程分开) - 所以我有3个线程”
听起来您假设通过扩展 SurfaceView,您会自动获得另一个与 UI 线程分开的 Surface 底层线程。我相信事实并非如此。
来自 SurfaceView 的 Android 开发人员参考:“此类的目的之一是提供一个表面,辅助线程可以在其中呈现到屏幕中。” 关键词是can。您仍然必须自己生成单独的线程,SurfaceView 只是使在单独的线程中绘制到画布变得更容易。
如果以 LunarLander 为例,它只有两个线程:UI 线程和手动生成的“LunarThread”,其中更新物理并绘制画布(通过 SurfaceHolder.lockCanvas()),速度最快可能,独立于 UI 线程。