2311skia,01渲染架构
一,渲染层级
从渲染流程上分,Skia可分为如下三个层级:
1,指令层:SkPicture,SkDeferredCanvas->SkCanvas
这一层决定要绘图的操作,绘图操作的预变换矩阵,当前裁剪区域,在哪些层上绘图,层的生成与合并.
2,解析层:SkBitmapDevice->SkDraw->SkScan,SkDraw1Glyph::Proc
这一层决定绘画方式,完成坐标变换,解析出需要绘画的形体(点/线/规整矩形)并做好抗锯齿处理,解析好相关资源并设置Shader.
3,渲染层:SkBlitter->SkBlitRow::Proc,SkShader::shadeSpan等
(如果需要)这一层采样,产生实际绘画效果,完成适配颜色格式,(如果需要)透明度混合和抖动处理.
二,主要类介绍
1,SkCanvas
这是复杂度超出想像的一个类.
(1)API设计
a,创建:
在安卓中,主要,由SkBitmap创建SkCanvas:
explicit SkCanvas(const SkBitmap& bitmap);
该方法由bitmap创建一个SkBitmapDevice,再设置该SkBitmapDevice为SkCanvas的渲染目标.
5.0之后,提供了创建SkCanvas的快捷方法:
static SkCanvas* NewRasterDirect(const SkImageInfo&, void*, size_t);
这样,GraphicBuffer就不需要创建与它关联的SkBitmap.
5.0之后引入的离屏渲染:
static SkCanvas* NewRaster(const SkImageInfo&);
创建通过readPixels读取绘画内容的SkCanvas,仍是CPU绘图.
b,状态:
1,矩阵状态:
矩阵决定当前绘画的几何变换:
rotate,skew,scale,translate,concat
2,裁剪状态:
裁剪决定当前绘画的生效区间:
clipRect,clipRRect,clipPath,clipRegion
3,保存与恢复:
save,saveLayer,saveLayerAlpha,restore
c,渲染:
大部分渲染的API都可由这三个组合而成:
drawRect(矩形/图像绘画),drawPath(不规则图形图像绘画)和drawText(文本绘画)
d,读取与写入像素:
readPixels,writePixels
考虑不同绘图设备的异质性,主要由设备实现.
(2)MCRec状态栈
fMCStack是存储的全部状态集,fMCRec则是当前的状态.
在save/saveLayer/saveLayerAlpha时,会新建一个在restore时,析构栈顶的MCRec.
每个状态包括如下信息:
class SkCanvas::MCRec {
public:int fFlags;//保存的状态标识(是否保存矩阵/裁剪/图层)矩阵指针.SkMatrix* fMatrix;//若该状态有独立矩阵,则指向内存`(fMatrixStorage)`,否则用上一个`MCRec`的`fMatrix`.SkRasterClip* fRasterClip;//裁剪区域,若该状态有独立裁剪区域,则指向内存`(fRasterClip)`,否则继承上一个的.SkDrawFilter* fFilter;DeviceCM* fLayer;//该状态所拥有的`层`(需要在此`MCRec`析构时回收)DeviceCM* fTopLayer;//该状态下,要求要绘画的`层`链表.(这些`层`不一定属于此状态)......
};
DeviceCM:图层链表,包装一个SkBaseDevice,附加一个变化位置偏移的矩阵(在saveLayer时指定的坐标).
(3)两重循环绘画
研究Skia的人,一般都会被一开始的两重循环弄晕一会,比如drawRect的代码:
LOOPER_BEGIN(paint, SkDrawFilter::kRect_Type, bounds)
while (iter.next()) {iter.fDevice->drawRect(iter, r, looper.paint());
}
LOOPER_END()
先完全展开上面的代码:
AutoDrawLooper looper(this, paint, false, bounds);
while (looper.next(type)) {SkDrawIter iter(this);while (iter.next()) {iter.fDevice->drawRect(iter, r, looper.paint());}
}
第一重循环即AutoDrawLooper,该next是后处理,在有SkImageFilter时,先渲染到临时层上,再处理该层,过滤后画到当前设备上.
第二重循环是,绘画当前状态所依附的所有层的SkDrawIter.
一般,都可忽略这两重循环.
个人认为Skia在绘画入口SkCanvas的设计并不是很好,图层,矩阵与裁剪混一起,导致难以去掉渲染任务,后面引入GPU渲染和延迟渲染都让人感到有些生硬.
2,SkDraw,SkBlitter
这里简单介绍:
SkDraw是CPU绘图的实现入口,主要任务是准备渲染(形状确定,几何变换,字体解析,构建图像Shader等).
SkBlitter不是单独的一个类,而是指代了一系列根据图像格式,是否包含Shader等区分出来的一系列子类.
这一族类执行真正的渲染任务,来绘画像素.
相关文章:
2311skia,01渲染架构
一,渲染层级 从渲染流程上分,Skia可分为如下三个层级: 1,指令层:SkPicture,SkDeferredCanvas->SkCanvas 这一层决定要绘图的操作,绘图操作的预变换矩阵,当前裁剪区域,在哪些层上绘图,层的生成与合并. 2,解析层:SkBitmapDevice->SkDraw->SkScan,SkDraw1Glyph::Proc 这…...
天线的负载
在电磁学和通信工程领域,天线的负载(Load)通常指连接到天线的部分或元件,该部分在电学上对天线的输入产生影响。天线的负载可以是被连接到天线的阻抗元件、电感、电容、电阻或其他电性元件。 具体而言,天线的负载是指…...
Java学习路径:入门学习、深入学习、核心技术,操作案例和实际代码示例
学习路径:入门学习、深入学习、核心技术, 每个主题都包括很多的操作案例和实际代码示例。 a. 入门学习: 1. 基础语法: 变量和数据类型: // 定义和初始化变量 int age 25;// 不同数据类型的声明 double price 19.99…...
Python武器库开发-前端篇之CSS元素(三十二)
前端篇之CSS元素(三十二) CSS 元素是一个网页中的 HTML 元素,包括标签、类和 ID。它们可以通过 CSS 选择器选中并设置样式属性,以使网页呈现具有吸引力和良好的可读性。常见的 HTML 元素包括 div、p、h1、h2、span 等,它们可以使用 CSS 设置…...
作为Java初学者,如何快速学好Java?
作为Java初学者,如何快速学好Java? 开始的一些话 对于初学者来说,编程的学习曲线可能相对陡峭。这是正常现象,不要感到沮丧。逐步学习,循序渐进。 编程是一门实践性的技能,多写代码是提高的唯一途径。尽量…...
LuatOS-SOC接口文档(air780E)--pwm - PWM模块
pwm.open(channel, period, pulse, pnum, precision) 开启指定的PWM通道 参数 传入值类型 解释 int PWM通道 int 频率, 1-1000000hz int 占空比 0-分频精度 int 输出周期 0为持续输出, 1为单次输出, 其他为指定脉冲数输出 int 分频精度, 100/256/1000, 默认为100,…...
基于51单片机的人体追踪可控的电风扇系统
**单片机设计介绍, 基于51单片机超声波测距汽车避障系统 文章目录 一 概要概述硬件组成工作原理优势应用场景总结 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 基于51单片机的人体追踪可控的电风扇系统介绍 概述 该系统是基于51…...
使用数据集对SegFormer模型进行微调以改进自动驾驶车辆的车道检测-附源码下载
SegFormer:细分严重影响了高级驾驶辅助系统的开发。它在自动驾驶汽车技术的快速发展中发挥了关键作用。它由多个复杂的组件组成。对于任何在道路上行驶的车辆来说,车道检测至关重要。车道是道路上的标记,有助于区分道路上的可行驶区域和不可行驶区域。当前一代有多种车道检测…...
【微服务专题】SpringBoot自动配置简单源码解析
目录 前言阅读对象阅读导航前置知识什么是自动配置0.1 基本概念0.2 SpringBoot中的【约定大于配置】0.3 从SpringMVC看【约定大于配置】0.4 从Redis看【约定大于配置】0.5 小结 笔记正文一、EnableAutoConfiguration源码解析二、SpringBoot常用条件注解源码解析2.1 自定义条件注…...
分布式数据恢复-hbase+hive分布式存储误删除如何恢复数据?
hbasehive分布式存储数据恢复环境: 16台某品牌R730XD服务器节点,每台物理服务器节点上有数台虚拟机,虚拟机上配置的分布式,上层部署hbase数据库hive数据仓库。 hbasehive分布式存储故障&初检: 数据库文件被误删除…...
安卓系统修图软件(一)
平时我们会不时在朋友圈发自己的自拍照,或者是风景图等,许多小伙伴们此时会对照片进行一定的修理,比如添加滤镜等操作。在电脑上用ps修图比较繁琐,日常中大可不必用这把宰牛刀;而手机自带的编辑器,或者是QQ…...
截图转HTML代码,支持预览,前端不用浪费时间写html和css了
截图转代码 试用地址:https://picoapps.xyz/free-tools/screenshot-to-code 这个简单的应用可以将截图转换为HTML/Tailwind CSS代码。它使用GPT-4 Vision来生成代码,并使用DALL-E 3来生成类似的图像。现在你也可以输入一个URL来克隆一个现有的网站&#…...
Vite CSS Module 优雅的处理样式隔离
今天介绍的是我写的一个vite插件vite-plugin-oneof-css-module,该插件主要处理scss module,那它适用于什么场景呢? 1. 最大的特点就是使用scss module 可以不用写 .module.scss 了 2. 可以根据不同的文件夹或文件分别进行不同的处理&#x…...
基于Springboot+Vue选课系统
选课系统要求 (1)数据库表:教师信息表、学生信息表、课程表、选课表 其中,教师信息表、学生信息表和选课表的数据需要提前设置,本题主要操作课程表 (2) 技术架构: 后台使用springboot 前端使用vue-admin-template (3) 考试时间&…...
智能汽车十大网络安全攻击场景-《智能汽车网络安全权威指南》
引言 大家都很熟悉OWASP Top 10风险报告,这个报告不但总结了Web应用程序最可能、最常见、最危险的10大安全隐患,还包括了如何消除这些隐患的建议,这个“OWASP Top 10“差不多每隔三年更新一次。目前汽车网络安全攻击威胁隐患繁多,…...
递归方法来计算二叉树的双分支节点个数
1.递归方法来计算二叉树的双分支节点个数 首先,你需要定义二叉树的节点结构,然后编写递归函数 #include <stdio.h> #include <stdlib.h>// 定义二叉树的节点结构 struct TreeNode {int value;struct TreeNode* left;struct TreeNode* righ…...
INFLOW:用于检测隐藏服务器的反向网络流水印
文章信息 论文题目:INFLOW: Inverse Network Flow Watermarking for Detecting Hidden Servers 期刊(会议):IEEE INFOCOM 2018 - IEEE Conference on Computer Communications 时间:2018 级别:CCF A 文章链…...
社区物联网云服务架构设计
文章目录 1 摘要2 架构图2.1 社区物联网云服务网络拓扑图2.2 社区物联网云服务通讯流程图2.3 社区远程开锁功能流程图 3 应用场景 1 摘要 随着社区管理越来越智能化,社区物联网升级与改造的市场空间也越来越大。社区物联网包含楼宇对讲、门禁门锁、通道闸等等设备系…...
Linux - 文件系统 - 理解目录 - 理解 软/硬链接
前言 在上篇博客当中,我们对 文件系统 和 inode 做了初步了解,本博客将在上篇博客的基础之上,对于 文件系统当中的目录进行进步一阐述。 Linux - 进一步理解 文件系统 - inode - 机械硬盘-CSDN博客 目录 一个文件有一个 inode,…...
Springboot websocket前端无法访问到,Websocket因AOP代理 前端无法请求到
Springboot websocket前端无法访问到,Websocket因AOP代理 前端无法请求到 问题出现 在我后端springboot启动后,前端无法请求websocket请求连接到我们websocket服务器。 想要的效果 在我后端springboot启动后,前端可以请求到我们websocket…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
