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…...
idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
