2312skia,15vulkan及技巧
ANGLE介绍
ANGLE
,把OpenGLES2
或3
调用转换为DirectX9,11
或OpenGL
调用.这些说明记录了如何在Windows
或Linux
上使用ANGLE
而不是本地OpenGL
后端.
细节
gclient sync
下载ANGLE
的源码及Skia
的其他仅测试依赖项.
要针对ANGLE
构建Skia
测试工具,请添加skia_use_angle=true
到args.gn
文件中(或运行gn args
来编辑).
运行工具时,请使用--config angle_<backend>_<frontend>
,如
out/Debug/dm --src gm --config angle_d3d11_es2
out/Release/nanobench --config angle_gl_es2
Vulkan
Skia
的GPU
后端有一个Vulkan
实现.可与OpenGL
后端一起构建Vulkan
后端.客户可在运行时在OpenGL
和Vulkan
实现间选择.
Vulkan
后端已达到与OpenGL
后端的功能等价.目前,许多Vulkan
驱动都存在没有解决方法的触发Skia
的错误.
会在发现
错误时向供应商报告错误.
Windows
和Linux
要构建Vulkan
后端,请在args.gn
中设置skia_use_vulkan=true
.
Android
可在装有Vulkan
驱动的设备
上运行包括所有AndroidN+
设备的Vulkan
后端.要构建Vulkan
后端,请在args.gn
中设置ndk_api=24
来指定AndroidN
目标.
Mac
可用SwiftShader
在软件仿真中运行Vulkan
后端.这允许通过dm
测试和调试,在查看器等交互式应用中不支持Vulkan
.
Skia
已按外部依赖项包含SwiftShader
库.要构建
它,先要安装CMake
.
准备好CMake
后,需要编译SwiftShader
.请按以下步骤操作,替换你的实际Skia
目录,而不是下面的$(SKIA_DIR)
:
$ cd $(SKIA_DIR)/third_party/externals/swiftshader/build$ cmake ..$ cmake --build . --parallel
构建完成后,SwiftShader
的构建目录,应包含包含libvk_swiftshader.dylib
的Darwin
子目录.为了让Skia
看到该库,需要在args.gn
中如下引用它:
skia_use_vulkan = true
extra_cflags = [ "-D", "SK_GPU_TOOLS_VK_LIBRARY_NAME=$(SKIA_DIR)/third_party/externals/swiftshader/build/Darwin/libvk_swiftshader.dylib" ]
使用Vulkan
后端
要创建由Vulkan
支持的GrContext
,客户会创建
一个Vulkan
设备和队列,初化GrVkBackendContext
来描述环境,然后调用GrContext::MakeVulkan
:
sk_sp<GrVkBackendContext> vkContext = new GrVkBackendContext;vkBackendContext.fInstance = vkInstance;vkBackendContext.fPhysicalDevice = vkPhysDevice;...vkBackendContext.fInterface.reset(GrVkCreateInterface(instance, vkPhysDevice, extensionFlags);...sk_sp<GrContext> context = GrContext::MakeVulkan(vkBackendContext);
使用Vulkan
后端时,用GrVkImageInfo
来构造,创建引用Skia
客户创建的VkImages
的SkSurface
和SkImage
对象的GrBackendTexture
和GrBackendRenderTarget
对象.
应按GrVkImageInfo*
解释SkImage::getTextureHandle(),SkSurface::getTextureHandle()
和SkSurface::getRenderTargetHandle()
返回的GrBackendObject
.这允许客户取SkImage
或SkSurface
的支持VkImage
.
GrVkImageInfo
指定VkImage
和关联的状态(平铺,布局,格式
等).通过getTextureHandle()
或getRenderTargetHandle()
取GrVkImageInfo*
后,客户应检查fImageLayout
字段,以了解Skia
在使用VkImage
之前,将VkImage
保留在哪个布局
中.
如果客户更改了VkImage
的布局,则应在恢复Skia
渲染前,调用GrVkImageInfo::updateImageLayout(VkImageLayoutlayout)
.
在Skia
对通过GrVkImageInfo
导入Skia
的VkImage
执行I/O
之前,客户负责期望的同步
或阻塞
.Skia
假定无需额外
同步,就可开始发出引用VkImage
的命令.
提示
在Chromium
中网页上抓.skp
文件
使用experimental/tools/web_to_skp
脚本,或会如下:
1,使用--no-sandbox --enable-gpu-benchmarking
启动Chrome
或Chromium
.
2,打开JS
控制台(Ctrl+Shift+J(Windows/Linux)
或Cmd+Opt+J(MacOS))
3.执行:chrome.gpuBenchmarking.printToSkPicture('/tmp')
,会在成功时返回"undefined"
.
在Skia
调试器中打开生成
文件,用dm
栅格化它,或使用Skia
查看器查看:
out/Release/dm --src skp --skps /tmp/layer_0.skp -w /tmp \--config 8888 gpu pdf --verbosels -l /tmp/(*)/skp/layer_0.skp.*out/Release/viewer --skps /tmp --slide layer_0.skp
在Chromium
中的网页上抓.mskp
文件
多页Skia
图片文件抓捕
为生成PDF
和打印文档
而发送
的命令.
使用experimental/tools/web_to_mskp
脚本,或会如下:
前2同上,第3步执行
chrome.gpuBenchmarking.printPagesToSkPictures('/tmp/filename.mskp')
在Skia
调试器中打开生成
文件,用dm
栅格化它,或使用Skia
查看器查看:
experimental/tools/mskp_parser.py /tmp/filename.mskp /tmp/filename.mskp.skpls -l /tmp/filename.mskp.skp# open filename.mskp.skp in the debugger.out/Release/dm --src mskp --mskps /tmp/filename.mskp -w /tmp \--config pdf --verbosels -l /tmp/pdf/mskp/filename.mskp.pdf
如何在Skia
中添加硬件加速
Skia
可通过两个方式利用指定硬件.
1,自定义瓶颈例程
Skia
的blit
中有一组瓶颈例程
,可在平台上替换这些例程,以利用指定的CPU
功能.一个此例
是ARMv7
设备上的NEONSIMD
指令.见src/opts/
这里
Skia
是否支持字体提示
Skia
有个内置
字体缓存,但它不知道如何把实际TrueType
等字体文件渲染
到其缓存中.为此,它依赖平台
来提供SkScalerContext
的实例.
这是Skia
与字体缩放器
引擎通信的抽象接口
.在src/ports
中,可见FreeType,macOS
和WindowsGDI
字体引擎
的支持文件.
其他字体引擎
也可轻松
类似支持.
Skia
是否调整字距
变形
是用适当字体
转换Unicode
文本跨度
为固定
字形跨度的过程.
Skia
不改变文本.Skia
提供了来绘画
字形的接口,但不实现
文本变形器.Skia
的客户经常使用HarfBuzz
来生成包括调整字距的字形
及其位置
.
这里是如何结合使用Skia
和HarfBuzz
的示例.此例中,使用相同的mmap()
的.ttf
字体文件创建SkTypeface
和hb_face_t
.
用HarfBuzz
面来变形Unicode
文本为一系列字形和位置
,然后可用SkTypeface
绘画这些字形
.
如何在文本上添加阴影
混合模式
描述如何替换目标像素
为自身
像素和源像素
的组合.Blend_Mode
可用源和/或目标
.Blend_Mode
可独立地操作每个Color
组件,也可允许所有源像素组件为一个目标像素组件.
Blend_Mode
不使用相邻像素
来确定结果.
Blend_Mode
使用源
及读取目标α
来确定写入的目标α
;源和目标α
也可能影响写入
的目标Color
组件.
在源像素和目标像素中,无论是如何编码的α
,几乎所有Color_Types
都将其视为从0到1
的区间.而且,几乎所有Blend_Mode
算法都限制了输出
,因此所有结果也是零到一
.
两个例外是SkBlendMode::kPlus
和kRGBA_F16_SkColorType
.
SkBlendMode::kPlus
允许计算大于1
的α
和Color
分量值.对除kRGBA_F16_SkColorType
以外的Color_Types
,生成的α
和分量值
被限制为1
.
kRGBA_F16_SkColorType
允许值超出0到1
的区间.由客户决定确保
结果在0到1
的区间内,因此良好
定义.
组合
数字图像通过SkBlendMode::kXor
,描述了Porter_Duff
模式的SkBlendMode::kClear
.
使用Porter_Duff
合成,绘画
带透明度的位图
可自由
清理目标.
用Porter_Duff
合成,绘画有透明度的几何图形
不会组合
透明源像素
,从而保持几何体
外部的目标位置
不变.
SkBlendMode::kPlus
和SkBlendMode::kScreen
模式使用简单算术
来使目标
变亮或变暗.:SkBlendMode::kOverlay
到SkBlendMode::kMultiply
模式,使用更复杂的算法
来变亮或变暗
;
有时如混合模式
,会同时执行
这两个操作.
SkBlendMode::kModulate
是SkBlendMode::kSrcATop
和SkBlendMode::kMultiply
的混搭.它乘以包括α
的所有组件
;
与SkBlendMode::kMultiply
不同,如果源或目标
为透明
,则结果为透明
.SkBlendMode::kModulate
使用预乘值
来计算乘积;
SkBlendMode::kMultiply
使用非预乘值
值来计算乘积
.
SkBlendMode::kHue,SkBlendMode::kSaturation,SkBlendMode::kColor
和SkBlendMode::kLuminosity
模式用所有分量
颜色信息,用不可分离
混合模式,转换源和目标
像素.
相关文章:

2312skia,15vulkan及技巧
ANGLE介绍 ANGLE,把OpenGLES2或3调用转换为DirectX9,11或OpenGL调用.这些说明记录了如何在Windows或Linux上使用ANGLE而不是本地OpenGL后端. 细节 gclient sync下载ANGLE的源码及Skia的其他仅测试依赖项. 要针对ANGLE构建Skia测试工具,请添加skia_use_angletrue到args.gn文件…...

TLSF算法概念,原理,内存碎片问题分析
TLSF算法介绍 TLSF(Two-Level Segregated Fit,两级分割适应算法)。 第一级(first level,简称fl):将内存大小按2的幂次方划分一个粗粒度的范围,如一个72字节的空闲内存的fl是6(72介…...

sharding-jdbc实现分库分表
shigen日更文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 😅😅最近几天的状态有点不对,所以有几天没有更新了。 当我们的数据量比较大…...

JDK中lock锁的机制,其底层是一种无锁的架构实现的,公平锁和非公平锁
简述JDK中lock锁的机制,其底层是一种无锁的架构实现的,是否知道其是如何实现的 synchronized与lock lock是一个接口,而synchronized是在JVM层面实现的。synchronized释放锁有两种方式: 获取锁的线程执行完同步代码,…...

c++通过serial库进行上下位机通信
编辑 风紊 现役大学牲,半退休robomaster视觉队员 写在前面 本文章主要介绍的是如何通过开源的serial库和虚拟串口实现上位机和下位机通信。 需求 假设下位机有这样一个数据报发送给上位机 struct DataRecv {char start s;TeamColor color TeamColor::Blu…...

【傻瓜级JS-DLL-WINCC-PLC交互】7.C#直连PLC并读取PLC数据
思路 JS-DLL-WINCC-PLC之间进行交互,思路,先用Visual Studio创建一个C#的DLL控件,然后这个控件里面嵌入浏览器组件,实现JS与DLL通信,然后DLL放入到WINCC里面的图形编辑器中,实现DLL与WINCC的通信。然后PLC与…...

指针常量和常量指针的区别
文章目录 指针常量常量指针即是指针常量又是常量指针 指针常量 指针常量的本质是常量,表示的是 这个指针所指向的地址不能发生改变。即指针变量的值(即地址值)不能发生修改。但是指针所指向的那块内存里的值是可以修改的。 注意:…...

离散化算法总结
离散化是将大范围的数字映射到小范围的区间内,适用于稀疏的区间。 两个问题需要考虑: 1. 原数组中可能有重复元素,需要去重。 2. 如何算出离散化后的值(离散化后保序,使用二分)。 题目链接: …...

【海思SS528 | VO】MPP媒体处理软件V5.0 | VO模块编程总结
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...

逻辑卷管理器lvm
啥意思,个人理解就是可以将物理分区合并一起组成大的磁盘,也可以移除其中的某个分区。 有四个概念需要了解下 PV,物理卷,VG 卷用户组,PE物理扩展块,LV逻辑卷 p物理,v卷,g用户组&a…...

函数声明后的“ - >”是什么?
这种语法的优势之一是可以在函数的返回类型中使用函数参数,使得返回类型更灵活。 先来看一个使用尾返回类型的例子: #include <iostream> auto add(int a, int b) -> int {return a b; }int main() {std::cout << add(3, 4) <<…...

51爱心流水灯32灯炫酷代码
源代码摘自远眺883的文章,大佬是30个灯的,感兴趣的铁汁们可以去看看哦~(已取得原作者的许可):基于STC89C51单片机设计的心形流水灯软件代码部分_单片机流水灯代码_远眺883的博客-CSDN博客 由于博主是个小菜鸡ÿ…...

将不同时间点的登录状态记录转化为不同时间段的相同登录状态SQL求解
题目 有不同时间点的登录状态记录表state_log如下 请使用sql将其转化为如下表的不同时间段的相同登录状态记录 思路分析: 此类问题需要用到lag或lead函数取上下行对应的数据,然后对前后结果做比较打标签(0或1),再…...

正则表达式与SQL数据库教程
使用正则表达式通过用例查询 Postgres 数据库: 正则表达式(又名 Regex) 正则表达式是一个强大的工具,广泛用于模式匹配和文本操作。 几乎所有编程语言都支持它们,并且经常用于文本提取、搜索和匹配文本等用例。 正则…...

HTML_web扩展标签
1.表格标签 2.增强表头表现 4.表格属性(实际不常用) 结构标签: 合并单元格: 更多请查看主页...

论文阅读:Distributed Initialization for VVIRO with Position-Unknown UWB Network
前言 Distributed Initialization for Visual-Inertial-Ranging Odometry with Position-Unknown UWB Network这篇论文是发表在ICRA 2023上的一篇文章,本文提出了一种基于位置未知UWB网络的一致性视觉惯性紧耦合优化测距算法( DC-VIRO )的分布式初始化方法。 对于…...

scrapy爬虫中间件和下载中间件的使用
一、关于中间件 之前文章说过,scrapy有两种中间件:爬虫中间件和下载中间件,他们的作用时间和位置都不一样,具体区别如下: 爬虫中间件(Spider Middleware) 作用: 爬虫中间件主要负…...

手敲单链表,简单了解其运行逻辑
1. 链表 1.1 结构组成 链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 链表的结构如下图所示,是由很多个节点相互通过引用来连接而成的;每一个节点由两部分组成,分别数据域&…...

Redis RDB
基于内存的 Redis, 数据都是存储在内存中的。 那么如果重启的话, 数据就会丢失。 为了解决这个问题, Redis 提供了 2 种数据持久化的方案: RDB 和 AOF。 RDB 是 Redis 默认的持久化方案。当满足一定条件的时候, 会把当前内存中的数据写入磁盘, 生成一个快照文件 dump.rdb。Redi…...

Elasticsearch一些函数查询
1. 根据价格分组统计数量,每组区间为2000, filter_pathaggregations 设置查询结果只展示函数结果 也有date_histogram函数根据日期分组等等 GET order/_search?filter_pathaggregations {"aggs": {"hist_price": {"histogr…...

竞赛选题 : 题目:基于深度学习的水果识别 设计 开题 技术
1 前言 Hi,大家好,这里是丹成学长,今天做一个 基于深度学习的水果识别demo 这是一个较为新颖的竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/pos…...

Linux expect命令详解
在Linux系统中,expect 是一款非常有用的工具,它允许用户自动化与需要用户输入进行交互的程序。本文将深入探讨expect命令的基本语法、使用方法以及一些最佳实践。 什么是Expect命令? expect 是一个用于自动化交互式进程的工具。它的主要功能…...

ubuntu18编译Android8的Failed to contact Jack server问题
环境 ubuntu18.04 Android8.1.0 步骤 安装环境 apt install git-core apt install gnupg apt install flex apt install bison apt install gperf apt install build-essential apt install curl apt install libc6-dev apt install libssl-dev apt install libncurses5-dev:…...

FindSecBugs支持的检测规则
很多SAST集成了FindSecBugs这个开源工具,其好处是直接对Class文件进行检测,也就是直接检测二进制问题,可以直接检测war、jar,还是非常方便的。虽然误报率较高,但是这些检测出来的安全漏洞很多是安全从业人员耳熟能详的…...

【WPF.NET开发】WPF.NET桌面应用开发概述
本文内容 为何从 .NET Framework 升级使用 WPF 进行编程标记和代码隐藏输入和命令控件布局数据绑定图形和动画文本和版式自定义 WPF 应用 Windows Presentation Foundation (WPF) 是一个与分辨率无关的 UI 框架,使用基于矢量的呈现引擎,构建用于利用现…...

态势感知是什么
在当今高度信息化的时代,信息安全风险已经成为企业、政府和个人的重要关注点。为了有效应对这些风险,态势感知成为了一种日益重要的能力。态势感知是一种基于环境的、动态、整体地洞悉安全风险的能力,是以安全大数据为基础,从全局…...

Spring MVC常用的注解, Controller注解的作用,RequestMapping注解的作用 @ResponseBody注解的作用
文章目录 Spring MVC常用的注解和注解的相关作用Controller注解的作用RequestMapping注解的作用ResponseBody注解的作用PathVariable和RequestParam的区别 Spring MVC常用的注解和注解的相关作用 RequestMapping:用于处理请求 url 映射的注解,可用于类或…...

「Verilog学习笔记」自动贩售机1
专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 自动贩售机中可能存在的几种金额:0,0.5,1,1.5,2,2.5,3。然后直接将其作为状态机的几种状…...

【大模型】更强的 ChatGLM3-6B 来了,开源可商用
【大模型】更强的 ChatGLM3-6B 来了,开源可商用 简介ChatGLM3-6B 环境配置环境搭建安装依赖 代码及模型权重拉取拉取 ChatGLM3-6B拉取 ChatGLM3-6B 模型权重及代码 终端测试网页测试安装 gradio加载模型并启动服务 参考 简介 ChatGLM3-6B ChatGLM3-6B 是 ChatGLM …...

Maxscript到Python转换工具教程
Maxscript到Python转换器教程 Maxscript到Python转换器采用MAXScript程序,将其解析为语法树,然后从语法树中生成等效的Python代码。通过提供python的自动翻译,帮助python程序员理解maxscript示例。 【项目状况】 将正确解析最正确的maxcript…...