为什么UI线程和Render线程不能同时运行?

问题描述 投票:0回答:3

我多年来一直是一名中等水平的 Android 开发人员。我喜欢安卓,但有一个大问题;掉帧。即使是最强大的设备也会经常卡顿,而 IOS 设备却可以稳定地以 60 fps 运行。我就是不明白为什么。我想知道。所以我做的第一件事就是观看有关性能的 I/O 演示。我真的不明白一件事。为什么ui和渲染线程不能同时运行?是的,我知道像渲染线程这样的基础知识,当 ui 线程正在做它的事情时,渲染线程不知道要渲染什么,但为什么渲染线程不能渲染之前的帧?您可以在这里观看视频: https://youtu.be/9HtTL_RO2wI?t=491 这是我要求的图表: Dıagram

你明白了。我不知道有关 android 的底层事情,有人可以像我五岁一样解释一下吗?

android multithreading
3个回答
1
投票

您的进程的主线程负责渲染将呈现给用户的帧,因此您应该保持代码尽可能快速、轻松地运行。如果您必须执行一些繁重的处理或访问任何 IO(网络、SD卡等),这可能会影响应用程序的流动性,因为线程可能正在等待响应。

作为一个好的实践,您应该在另一个线程上启动 IO 访问/繁重处理以在后台运行,并让系统决定运行它的优先级,如有必要,建议向用户提供一些反馈,例如进度条或其他指示内容正在处理某些内容。

此外,渲染线程在执行之前需要知道要渲染什么,因此 UI 线程必须处理应用程序想要向用户呈现哪些信息。


1
投票

正如 @JonGoodwin 指出的,它们都是并行运行的,但通常在同一处理器的两个内核中运行,因为现在的手机至少有两个内核。两个线程都在 CPU 中运行,其中 RenderThread 将渲染命令发送到 GPU。请注意,自 API 21 以来,情况确实如此(RenderThread 是实现涟漪效应等功能的原因)。

问题是 @LucianoFerruzzi 指出的:通常是糟糕的代码,在 UI 线程中执行太多操作(RenderThread 不可访问,至少使用标准机制不可访问)。

另外,请参阅Android 开发者后台的以下剧集:第 74 集:图形


0
投票

我遇到了同样的问题,即动画翻译以 500 毫秒的轮询速率在屏幕上移动图像视图。我运行自己的所有线程,甚至与 android 处理程序类分开,并且仅在初始化时调用 ui 线程来生成图像。然而不知何故,几分钟后,用户界面停止响应触摸输入,它们被接收但不执行任何操作。进程监视器和线程转储仅显示主算法之外的睡眠和等待进程(这是由一组守护线程组成的单独服务)。延长 500 毫秒帧速率来处理下一个动画翻译可以延长 ui 寿命,但不会太长,我还没有看到它持续超过 10-15 分钟。我发现,随着翻译器的每次新迭代,android 的动画师似乎越来越深入地陷入一些失效循环。我还不确定如何防止这种情况,但问题已经确定。

© www.soinside.com 2019 - 2024. All rights reserved.