HWUI源码剖析(一) - 渲染中RenderProxy视角看一种很有用的编程模式

本文介绍了Android HWUI中RenderProxy的编程模式,类似于Looper/Handler机制,但更专注于函数调用的封装。文章讨论了如何在线程间通信,特别是RenderProxy如何构建和发送消息给RenderThread,以及RenderThread如何处理和执行任务。

概述

实际的工程项目中,往往都是多线程编程,也就是必然有某些业务逻辑或者功能要运行在特定的线程,比如android开发中常见的IO线程,UI线程,Render线程,这样会涉及从线程A向这些工作线程通信或者函数调用的代码编程,具体实现上可以有多种多样,但是他们的核心思想其实都是一致的,Android Handler/Looper视角看UI线程的原理_nginux的博客-优快云博客

这篇文章中介绍的Looper/Handler机制其实就是很精妙的一种,其他的具体编程也往往跟这种思想是一致的,只是根据不同的业务场景,编码形式上面稍作改变,本文将介绍的是阅读Android HWUI中RendProxy和DrameFrameTask以及RenderThread源码的一种类似的编程模式。

业务场景及设计思想

假设我们的工作的业务模型描述如下:需要在线程A处理各种业务逻辑,那么就需要一个类实现一些接口类A来向B线程发送消息,线程A在没有消息的时候休眠,有消息之后取出处理,这里面涉及几个核心问题:

  1. 接口类A怎么给线程B发送消息,包括重要参数传递,以及拿到返回值。
  2. 线程B怎么做到没有消息时候休眠,有消息之后处理,这里面最重要的是线程B的收消息处理的实现代码,是否要跟消息发送方耦合(比如代码上要知道发送消息的ID,参数类型等)。

上述编程模式的代码实现上,往往我们成为接口类A为xxxProxy,相应的android hwui中名字叫做RenderPrody;线程B必须有一个线程循环体,不断取出消息并处理,具体到这里,由于是函数调用,基于面向对象的编程思想,这里的”消息“我们可以封装程一个类对象,android hwui中这里叫做:RenderTask,由于这个消息必须”可执行“,所以这个RenderTask得具备一个run()函数,同时基于多态的思想,这个RenderTask的run()可执行是个基类接口,因为具体”可执行“的任务可能有多种类型,比如渲染,函数调用等,所以同时可以定义一个函数调用的RenderTask,android Hwui中叫:MethodInvokeRenderTask,由于函数调用包括:函数体,参数和返回值,所以MethodInvokeRenderTask类中必须有表示函数体,参数和返回值的成员变量。

上面的设计模式有一种好处就是:把整个函数调用的执行最终封装成一个函数调用,这样在Proxy里面把对应的函数指针封装到类MethodInvokeRenderTask中,具体在线程中循环取出”消息“(Task)只要执行对应的函数体就好了,相对比还有一种实现模式类似Looper/Handler:向线程B发送消息消息的时候,给”消息”按ID分类,那么B线程收到处理的时候,按ID分别实现对应的处理函数,整个是不是特别类似Looper/Handler。而本文介绍的模式不需要显示按ID来实现,只要四号线一个函数处理实体就好了,线程B收到相应的“消息”,把参数取出来,调用对应的函数实体就好了。

源码实现

class ANDROID_API RenderTask {
public:
    ANDROID_API RenderTask() : mNext(nullptr), mRunAt(0) {}
    ANDROID_API virtual ~RenderTask() {}

    ANDROID_API virtual void run() = 0;

    RenderT
GPU呈现模式分析与HWUI呈现模式分析是两个相关但不同的概念。 GPU呈现模式分析主要关注图形处理器(GPU)在渲染帧时的行为,尤其是渲染时间的分布和效率。通过这种分析,可以了解每帧的绘制过程是否流畅,是否存在瓶颈,以及GPU的负载是否均衡。Android系统提供了多种工具来可视化这些数据,例如通过“GPU呈现模式分析”功能,可以以条形图的形式显示每帧的渲染时间,并帮助开发者识别帧率是否稳定、是否存在过度绘制等问题[^1]。 HWUI(Hardware Acceleration UI)呈现模式分析则是更具体的个子集,它关注的是Android系统中硬件加速的UI渲染管线。HWUIAndroid中用于管理UI渲染的框架,它负责将UI元素转换为GPU能够处理的图形数据。因此,HWUI呈现模式分析主要聚焦于UI渲染管线中的各个阶段,例如布局计算、绘制命令的生成以及最终的GPU渲染过程。通过HWUI呈现模式分析,开发者可以更深入地了解UI渲染的具体耗时阶段,并优化这些阶段以提高应用的性能。 总结来说,GPU呈现模式分析是个更广泛的概念,涵盖了GPU在渲染过程中的整体行为,而HWUI呈现模式分析则专注于Android系统中UI渲染的具体实现和优化。两者虽然有交集,但并不完全相同。 ### 示例代码:启用GPU呈现模式分析 在Android设备上,可以通过以下方式启用GPU呈现模式分析功能: ```java // 启用GPU呈现模式分析(在代码中设置) public void enableGpuRenderingProfile() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { // 启用GPU呈现模式分析 getFragmentManager().setFragmentFactory(new FragmentFactory() { @Override public Fragment instantiate(ClassLoader classLoader, String className) { return super.instantiate(classLoader, className); } }); // 设置渲染模式为DEBUG_GPU_OVERDRAW setLayerType(View.LAYER_TYPE_HARDWARE, null); } } ``` 此外,开发者也可以通过设备的开发者选项手动启用GPU呈现模式分析,例如选择“GPU呈现模式分析”选项并选择“在屏幕上显示为条形图”。 --- ### 相关问题 1. 如何通过GPU呈现模式分析优化应用的帧率? 2. HWUI呈现模式分析中各个阶段的耗时如何解读? 3. 如何在Android设备上手动启用GPU呈现模式分析? 4. GPU过度绘制与HWUI呈现模式分析之间有何关联? 5. 如何通过调试GPU过度绘制来优化应用的UI性能?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值