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…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
多模态图像修复系统:基于深度学习的图片修复实现
多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
