当前位置: 首页 > article >正文

Skia 图形引擎介绍

在这里插入图片描述

文章目录

      • 一、Skia 的基本概念
        • 1. 定位与作用
        • 2. 历史背景
      • 二、Skia 的核心架构
        • 1. 模块化设计
        • 2. 渲染流程
        • 3. 跨平台适配
      • 三、Skia 在 Flutter 中的角色
        • 1. 自绘 UI 的核心依赖
        • 2. 跨平台一致性
        • 3. 性能优化
      • 四、Skia 的性能优势
        • 1. 高效的图形处理
        • 2. 与原生渲染的对比
        • 3. 性能瓶颈
      • 五、Skia 的应用场景
      • 六、与其他图形引擎的对比
      • 七、未来发展方向
      • 总结

Skia 是一个开源的 2D 图形渲染引擎,由 Google 主导开发和维护,广泛应用于 Android、Flutter、Chrome、Firefox 等项目中。它提供了高性能的图形绘制能力,支持跨平台硬件加速,是现代跨平台开发框架(如 Flutter)的核心底层依赖。


一、Skia 的基本概念

1. 定位与作用
  • 核心能力:实现 2D 图形(如形状、文本、图像)的高效绘制,支持矢量图形位图操作
  • 跨平台性:抽象底层图形 API(如 OpenGL、Vulkan、Metal),提供统一的接口,适配不同操作系统(Android、iOS、Windows、Linux、macOS)。
  • 应用场景:UI 渲染、图表绘制、图像处理、动画合成等。
2. 历史背景
  • 2005 年由 Skia Inc. 公司开发,后被 Google 收购并开源。
  • 现为 Chromium 项目的默认图形引擎,也是 Android 系统的图形库(替代早期 Canvas 实现)。

二、Skia 的核心架构

1. 模块化设计
  • Canvas:核心绘图接口,定义绘制命令(如 drawRect, drawText)。
  • Shaders:处理渐变、纹理填充等复杂视觉效果。
  • Path:定义矢量路径(贝塞尔曲线、几何形状)。
  • Fonts:文本渲染,支持多种字体格式(如 TrueType、OpenType)。
  • Image:位图解码与处理(支持 PNG、JPEG、WebP 等格式)。
  • GPU 加速:通过 OpenGL、Vulkan 或 Metal 实现硬件加速渲染。
2. 渲染流程
  • 命令记录:通过 SkCanvas 记录绘制操作(如画矩形、写文字)。
  • 合成与优化:合并重复操作,减少 GPU 调用次数。
  • 提交到 GPU:通过图形 API(如 OpenGL)将指令发送到 GPU 执行。
  • 显示结果:将帧缓冲数据输出到屏幕。
3. 跨平台适配
  • 后端支持:根据平台自动选择最佳图形 API:
    • Android:OpenGL ES / Vulkan
    • iOS/macOS:Metal
    • Windows:Direct3D / ANGLE(OpenGL 兼容层)
    • Web:WebGL / WebAssembly
  • 平台抽象层:通过 GrContext(GPU 上下文)隔离底层差异。

三、Skia 在 Flutter 中的角色

1. 自绘 UI 的核心依赖
  • Flutter 的 Widget 树最终转换为 Skia 绘制指令,直接渲染到屏幕,绕过平台原生控件
  • 例如,Flutter 的 Text Widget 通过 Skia 的文本渲染引擎绘制,而非调用 Android 的 TextView 或 iOS 的 UILabel
2. 跨平台一致性
  • 通过 Skia 的统一渲染,确保 Android 和 iOS 的 UI 表现完全一致。
  • 避免原生控件因平台差异导致的样式或行为问题(如滚动效果、动画曲线)。
3. 性能优化
  • 硬件加速:Skia 自动启用 GPU 渲染,提升复杂 UI 的流畅度。
  • 帧率控制:与 Flutter 引擎协作,支持 60/120 FPS 的高刷新率。
  • 离屏渲染:通过 SkPicture 缓存静态 UI,减少重复计算。

四、Skia 的性能优势

1. 高效的图形处理
  • 矢量图形优化:使用光栅化算法快速处理路径和曲线。
  • 文本渲染加速:支持字形缓存(Glyph Cache),减少字体解析开销。
  • 并行渲染:多线程提交 GPU 指令(如 Android 的 RenderThread)。
2. 与原生渲染的对比
场景Skia(Flutter)原生渲染
UI 一致性完全一致(跨平台)依赖平台控件,可能存在差异
复杂动画需手动优化(如避免过度重绘)系统级优化(如 Core Animation)
平台特性集成需通过插件桥接直接调用原生 API
包体积较大(包含引擎和 Skia 库)较小(仅平台必要组件)
3. 性能瓶颈
  • 首次启动延迟:需加载 Skia 库和初始化 GPU 上下文。
  • 重度图形计算:如实时滤镜、3D 变换,性能弱于直接调用平台 API(如 Metal)。

五、Skia 的应用场景

  1. 移动应用

    • Android 系统级绘图(如 View 的 Canvas)。
    • Flutter 应用的跨平台 UI 渲染。
  2. 浏览器渲染

    • Chromium 的 2D 图形绘制(如 HTML Canvas、CSS 样式)。
  3. 桌面应用

    • 如 Google Earth 的界面渲染。
  4. 嵌入式设备

    • 低功耗设备的图形显示(基于 Skia 的轻量级移植版)。

六、与其他图形引擎的对比

引擎特点典型应用
Skia专注 2D,跨平台,开源Flutter, Android
Core GraphicsiOS/macOS 原生 2D 引擎(Quartz 2D)iOS 应用
Direct2DWindows 原生 2D 引擎,深度集成 DXWindows 桌面程序
Cairo开源 2D,多用于 Linux 桌面GTK, Firefox

七、未来发展方向

  1. 更高效的 GPU 利用
    • 增加对 Vulkan 的深度支持,替代 OpenGL 作为默认后端。
  2. 3D 扩展
    • 实验性支持 3D 渲染(如与 Flutter 的 3D 插件结合)。
  3. WebAssembly 优化
    • 提升 Skia 在 Web 端的性能(如 Flutter Web)。

总结

Skia 通过统一的 2D 图形抽象层,平衡了跨平台适配与渲染性能,成为 Flutter 等框架的核心支柱。尽管在极端场景下可能略逊于原生优化,但其灵活性、一致性和开源生态使其成为现代跨平台开发的首选图形引擎。


结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!

相关文章:

Skia 图形引擎介绍

文章目录 一、Skia 的基本概念1. 定位与作用2. 历史背景 二、Skia 的核心架构1. 模块化设计2. 渲染流程3. 跨平台适配 三、Skia 在 Flutter 中的角色1. 自绘 UI 的核心依赖2. 跨平台一致性3. 性能优化 四、Skia 的性能优势1. 高效的图形处理2. 与原生渲染的对比3. 性能瓶颈 五、…...

jQuery从入门到应用:选择器、DOM与Ajax综合指南

文章目录 前言jQuery对象1、jQuery的使用在需要使用jQuery的页面引入Js文件使用jQuery选择页面元素并获取其文本内容 2、jQuery包装集与Dom对象DOM对象和jQuery对象的选择及互相转换 jQuery对象关键点说明: jQuery选择器1、基础选择器关键点说明 2、层次选择器关键点…...

10、基于osg引擎生成热力图高度图实现3D热力图可视化、3D热力图实时更新(带过渡效果)

1、结果 2、完整C代码 #include <sstream> #include <iomanip> #include <iostream> #include <vector> #include <random> #include <cmath> #include <functional> #include <osgViewer/viewer> #include <osgDB/Read…...

手搓智能音箱——语音识别及调用大模型回应

一、代码概述 此 Python 代码实现了一个语音交互系统&#xff0c;主要功能为监听唤醒词&#xff0c;在唤醒后接收用户语音问题&#xff0c;利用百度语音识别将语音转换为文本&#xff0c;再调用 DeepSeek API 获取智能回复&#xff0c;最后使用文本转语音功能将回复朗读出来。 …...

Modbus通信协议基础知识总结

1. 数据类型与存储区分类 Modbus协议将数据分为四类存储区&#xff0c;通过存储区代号区分&#xff1a; 输出线圈&#xff08;0x&#xff09;&#xff1a;可读写&#xff0c;对应二进制开关量&#xff08;如继电器状态&#xff09;&#xff0c;地址范围000001-065536&#xff…...

vue3 + css 列表无限循环滚动+鼠标移入停止滚动+移出继续滚动

1.动画文件.vue <template><div class"dashboard" click"setFullScreen"><div class"warp-box"><el-scrollbar ref"scrollRef" height"100%" scroll"handelScroll"><div class"…...

使用 CryptoJS 实现 AES 解密:动态数据解密示例

在现代加密应用中,AES(高级加密标准)是一种广泛使用的对称加密算法。它的安全性高、效率好,适合用于各种加密任务。今天,我们将通过一个实际的示例,展示如何使用 CryptoJS 实现 AES 解密,解密动态数据。CryptoJS 是一个基于 JavaScript 的加密库,它支持 AES、DES 等多种…...

Go语言对于MySQL的基本操作

一.下载依赖 终端中输入&#xff1a; go get -u github.com/go-sql-driver/mysql 导入包 import ("database/sql"_ "github.com/go-sql-driver/mysql" ) 二.案例 package main//go get-u github.com/go-sql-driver/mysql 获取驱动 import ("databa…...

AndroidStudio下载安装,环境部署以及常见问题解决教程(亲测)

AndroidStudio下载安装&#xff0c;环境部署以及常见问题解决&#xff01;&#xff01;&#xff01; 文章目录 前言 一、Android Studio 下载与安装 1.1 系统要求 1.2 下载 Android Studio 1.3 安装 Android Studio Windows 系统 1.4 初始配置 二、环境部署 2.1 安装 …...

开源免费一句话生成儿童故事视频核心思想解析

再看一个演示视频&#xff0c;学会核心思想后&#xff0c;可以打造自己的内容生成工具&#xff0c;后文有基于飞书多维表格的实现效果&#xff1a; 一句话灵感生成儿童故事视频演示 这是一款专门为内容素材创作打造的创新工具&#xff0c;可根据用户输入的主题&#xff0c;快速…...

数据结构——最短路(BFS,Dijkstra,Floyd)

完整版可以看我的最短路问题模版总结_稠密图最短路-CSDN博客 考研数据结构只考BFS,Dijkstra和Floyd 下面代码以Acwing模板题为例 BFS代码 适用类型&#xff1a; 1.单源最短路径 2.无权图 3.不适用于带权图和负权回路图 //Acwing走迷宫bfs #include<bits/stdc.h>usi…...

Kali Linux汉化教程:轻松设置中文界面

1.打开终端 2.输入sudo dpkg-reconfigure locales&#xff0c;回车&#xff0c;输入密码&#xff0c;回车 sudo dpkg-reconfigure locales 3.往下滑&#xff0c;滑到底&#xff0c;找到‘zh_CN.UTF-8 UTF-8’,回车 4.选择‘zh_CN.UTF-8’,回车 5.没有 ‘zh_CN.UTF-8’选项的特…...

分布式锁: 并发时,redis如何避免删别人的锁

在使用Redis实现分布式锁的时候&#xff0c;如何避免在并发情况下误删别人的锁。首先&#xff0c;分布式锁的基本概念&#xff1a;是多个客户端在访问共享资源时&#xff0c;通过某种机制来确保同一时间只有一个客户端能持有锁。 Redis通常用SET命令加上NX选项来创建锁&#xf…...

Leetcode 160 Intersection of Two Linked Lists

题意 给定两个链表&#xff0c;找这两个链表第一个公共节点&#xff0c;如果没有返回nullptr 题目链接 https://leetcode.com/problems/intersection-of-two-linked-lists/description/ 题解 两个指针分别从两个链表&#xff08;记录为表A&#xff0c;表B&#xff09;的表…...

【八股文】从浏览器输入一个url到服务器的流程

1.url解析与DNS解析 浏览器解析用户输入的URL&#xff0c;提取协议&#xff08;HTTP\HTTPS&#xff09;、域名、端口及路径等信息 浏览器首先检查本地DNS缓存和系统DNS缓存&#xff0c;若未命中&#xff0c;查询本地hosts文件 最后递归查询向本地DNS服务器发起请求&#xff…...

C++和标准库速成(八)——指针、动态数组、const、constexpr和consteval

目录 1. 指针和动态数组1.1 栈和自由存储区1.2 使用指针1.3 动态分配的数组1.4 空指针常量 2. const2.1 const修饰类型2.2 const与指针2.3 使用const保护参数2.4 const方法(建议&#xff09; 3. constexpr4. consteval参考 1. 指针和动态数组 动态内存允许所创建的程序具有在编…...

超声重建,3D重建 超声三维重建,三维可视化平台 UR 3D Reconstruction

1. 超声波3D重建技术的实现方法与算法 技术概述 3D超声重建是一种基于2D超声图像生成3D体积数据的技术&#xff0c;广泛应用于医学影像领域。通过重建和可视化三维结构&#xff0c;3D超声能够显著提高诊断精度和效率&#xff0c;同时减少医生的脑力负担。本技术文档将详细阐述…...

[HelloCTF]PHPinclude-labs超详细WP-Level 6Level 7Level 8Level 9-php://协议

由于Level 6-9 关的原理都是通用的, 这里就拿第6关举例, 其他的关卡同理 源码分析 定位到代码 isset($_GET[wrappers]) ? include("php://".$_GET[wrappers]) : ; 与前几关发生变化的就是 php:// 解题分析 这一关要求我们使用 php协议 php:// 协议 php://filte…...

【Linux】Bash是什么?怎么使用?

李升伟 整理 什么是 Bash&#xff1f; Bash&#xff08;Bourne Again Shell&#xff09;是一种 命令行解释器&#xff08;Shell&#xff09;&#xff0c;广泛用于 Unix 和 Linux 操作系统。它是 Bourne Shell&#xff08;sh&#xff09; 的增强版&#xff0c;提供了更多的功能…...

cmake结合qt开发界面程序实例

在使用 CMake 构建 Qt 界面应用程序时&#xff0c;你需要设置 CMakeLists.txt 文件来指定项目配置、源文件、库依赖等。以下是一个简单的示例&#xff0c;展示了如何创建一个包含 Qt 界面&#xff08;使用 QWidget&#xff09;的 Qt 项目&#xff0c;并使用 CMake 进行构建。 …...

vue3二次封装tooltip实现el-table中的show-overflow-tooltip效果

开发过程中遇到需要根据后端返回的数据长度来判断是否需要使用el-tooltip的情况&#xff0c;想到el-table里面就有这种交互效果&#xff0c;如果不论文字是否超出容器长度都展示tooltip的话&#xff0c;交互效果难免会差很多&#xff0c;所以二次封装了这个组件&#xff1a; 给…...

如何创建并保存HTML文件?零基础入门教程

原文&#xff1a;如何创建并保存HTML文件&#xff1f;零基础入门教程 | w3cschool笔记 本文将以Windows系统为例&#xff0c;教你用最简单的记事本创建并保存第一个HTML网页。 &#x1f4dd; 第一步&#xff1a;准备工具 文本编辑器&#xff1a;使用系统自带的记事本&#xff…...

React19源码系列之FiberRoot节点和Fiber节点

在上一篇文章&#xff0c;看了createRoot函数的大致流程。 createContainer函数创建并返回了FiberRoot 。FiberRoot是由createFiberRoot函数创建&#xff0c; createFiberRoot函数还将 FiberRoot和 根Fiber 通过current属性建立起了联系。将FiberRoot作为参数传给 ReactDOMRoo…...

每天看一篇漏洞报告

前言&#xff1a; 内容来源于乌云漏洞 今日思考xss漏洞&#xff0c; 今天看到一篇文章&#xff0c;里面详细说了xss的绕过技巧&#xff0c;虽然时间久了&#xff0c;没有去尝试&#xff0c;待会有时间去测试一下 以下是整理后的文章&#xff0c;原文在下面 文章链接&#…...

采用贝塞尔函数,进行恒定束宽波束形成算法

matlab采用贝塞尔函数&#xff0c;进行恒定束宽波束形成算法 beselle.m , 1452 20191225160928.png , 43700 20191225160935.png , 45238 20191225161010.png , 76862...

TCP协议的多线程应用、多线程下的网络编程

DAY13.2 Java核心基础 多线程下的网络编程 基于单点连接的方式&#xff0c;一个服务端对应一个客户端&#xff0c;实际运行环境中是一个服务端需要对应多个客户端 创建ServerSocketNable类&#xff0c;多线程接收socket对象 public class ServerSocketNable implements Run…...

华为中小型企业项目案例

实验目的(1) 熟悉华为交换机和路由器的应用场景 (2) 掌握华为交换机和路由器的配置方法 实验拓扑实验拓扑如图所示。 华为中小型企业项目案例拓扑图 实验配置市场部和技术部的配置创建VLANLSW1的配置 [LSW1]vlan batch 10 20 [LSW1]q…...

LabVIEW VI Scripting随机数波形图自动生成

通过LabVIEW VI Scripting 技术&#xff0c;实现从零开始编程化创建并运行一个随机数波形监测VI。核心功能包括自动化生成VI框架、添加控件与函数、配置数据流逻辑及界面布局优化&#xff0c;适用于批量生成测试工具、教学模板开发或复杂系统的模块化构建。通过脚本化操作&…...

MATLAB 控制系统设计与仿真 - 26

状态空间控制系统概述 状态空间描述 现代控制理论是建立在状态空间基础上的控制系统分析和设计理论&#xff0c;它用状态变量来刻画系统的内部特征&#xff0c;用‘一节微分方程组’来描述系统的动态特性。系统的状态空间模型描述了系统输入/输出与内部状态之间的关系&#x…...

Python----计算机视觉处理(Opencv:图像镜像旋转)

一、图像镜像旋转 图像的旋转是围绕一个特定点进行的&#xff0c;而图像的镜像旋转则是围绕坐标轴进行的。图像镜像旋转&#xff0c;也可 以叫做图像翻转&#xff0c;分为水平翻转、垂直翻转、水平垂直翻转三种。 通俗的理解为&#xff0c;当以图片的中垂线为x轴和y轴时&#x…...