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

2312skia,15vulkan及技巧

ANGLE介绍

ANGLE,把OpenGLES23调用转换为DirectX9,11OpenGL调用.这些说明记录了如何在WindowsLinux上使用ANGLE而不是本地OpenGL后端.

细节

gclient sync下载ANGLE的源码及Skia的其他仅测试依赖项.
要针对ANGLE构建Skia测试工具,请添加skia_use_angle=trueargs.gn文件中(或运行gn args来编辑).
运行工具时,请使用--config angle_<backend>_<frontend>,如

out/Debug/dm --src gm --config angle_d3d11_es2
out/Release/nanobench --config angle_gl_es2

Vulkan

SkiaGPU后端有一个Vulkan实现.可与OpenGL后端一起构建Vulkan后端.客户可在运行时在OpenGLVulkan实现间选择.

Vulkan后端已达到与OpenGL后端的功能等价.目前,许多Vulkan驱动都存在没有解决方法的触发Skia的错误.
会在发现错误时向供应商报告错误.

WindowsLinux

要构建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.dylibDarwin子目录.为了让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客户创建的VkImagesSkSurfaceSkImage对象的GrBackendTextureGrBackendRenderTarget对象.

应按GrVkImageInfo*解释SkImage::getTextureHandle(),SkSurface::getTextureHandle()SkSurface::getRenderTargetHandle()返回的GrBackendObject.这允许客户取SkImageSkSurface的支持VkImage.
GrVkImageInfo指定VkImage和关联的状态(平铺,布局,格式等).通过getTextureHandle()getRenderTargetHandle()GrVkImageInfo*后,客户应检查fImageLayout字段,以了解Skia在使用VkImage之前,将VkImage保留在哪个布局中.

如果客户更改了VkImage的布局,则应在恢复Skia渲染前,调用GrVkImageInfo::updateImageLayout(VkImageLayoutlayout).

Skia对通过GrVkImageInfo导入SkiaVkImage执行I/O之前,客户负责期望的同步阻塞.Skia假定无需额外同步,就可开始发出引用VkImage的命令.

提示

Chromium中网页上抓.skp文件

使用experimental/tools/web_to_skp脚本,或会如下:
1,使用--no-sandbox --enable-gpu-benchmarking启动ChromeChromium.
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,自定义瓶颈例程

Skiablit中有一组瓶颈例程,可在平台上替换这些例程,以利用指定的CPU功能.一个此例ARMv7设备上的NEONSIMD指令.见src/opts/这里

Skia是否支持字体提示

Skia有个内置字体缓存,但它不知道如何把实际TrueType等字体文件渲染到其缓存中.为此,它依赖平台来提供SkScalerContext的实例.

这是Skia字体缩放器引擎通信的抽象接口.在src/ports中,可见FreeType,macOSWindowsGDI字体引擎的支持文件.
其他字体引擎也可轻松类似支持.

Skia是否调整字距

变形是用适当字体转换Unicode文本跨度固定字形跨度的过程.

Skia不改变文本.Skia提供了来绘画字形的接口,但不实现文本变形器.Skia的客户经常使用HarfBuzz来生成包括调整字距的字形及其位置.

这里是如何结合使用SkiaHarfBuzz的示例.此例中,使用相同的mmap().ttf字体文件创建SkTypefacehb_face_t.
HarfBuzz面来变形Unicode文本为一系列字形和位置,然后可用SkTypeface绘画这些字形.

如何在文本上添加阴影

混合模式

描述如何替换目标像素自身像素和源像素的组合.Blend_Mode可用源和/或目标.Blend_Mode可独立地操作每个Color组件,也可允许所有源像素组件为一个目标像素组件.

Blend_Mode不使用相邻像素来确定结果.

Blend_Mode使用及读取目标α来确定写入的目标α;源和目标α也可能影响写入的目标Color组件.
在源像素和目标像素中,无论是如何编码的α,几乎所有Color_Types都将其视为从0到1的区间.而且,几乎所有Blend_Mode算法都限制了输出,因此所有结果也是零到一.

两个例外是SkBlendMode::kPluskRGBA_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::kPlusSkBlendMode::kScreen模式使用简单算术来使目标变亮或变暗.:SkBlendMode::kOverlaySkBlendMode::kMultiply模式,使用更复杂的算法变亮或变暗;

有时如混合模式,会同时执行这两个操作.

SkBlendMode::kModulateSkBlendMode::kSrcATopSkBlendMode::kMultiply的混搭.它乘以包括α的所有组件;
SkBlendMode::kMultiply不同,如果源或目标透明,则结果为透明.SkBlendMode::kModulate使用预乘值来计算乘积;
SkBlendMode::kMultiply使用非预乘值值来计算乘积.

SkBlendMode::kHue,SkBlendMode::kSaturation,SkBlendMode::kColorSkBlendMode::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&#xff08;Two-Level Segregated Fit&#xff0c;两级分割适应算法&#xff09;。 第一级&#xff08;first level,简称fl&#xff09;&#xff1a;将内存大小按2的幂次方划分一个粗粒度的范围&#xff0c;如一个72字节的空闲内存的fl是6&#xff08;72介…...

sharding-jdbc实现分库分表

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

JDK中lock锁的机制,其底层是一种无锁的架构实现的,公平锁和非公平锁

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

c++通过serial库进行上下位机通信

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

【傻瓜级JS-DLL-WINCC-PLC交互】7.​C#直连PLC并读取PLC数据

思路 JS-DLL-WINCC-PLC之间进行交互&#xff0c;思路&#xff0c;先用Visual Studio创建一个C#的DLL控件&#xff0c;然后这个控件里面嵌入浏览器组件&#xff0c;实现JS与DLL通信&#xff0c;然后DLL放入到WINCC里面的图形编辑器中&#xff0c;实现DLL与WINCC的通信。然后PLC与…...

指针常量和常量指针的区别

文章目录 指针常量常量指针即是指针常量又是常量指针 指针常量 指针常量的本质是常量&#xff0c;表示的是 这个指针所指向的地址不能发生改变。即指针变量的值&#xff08;即地址值&#xff09;不能发生修改。但是指针所指向的那块内存里的值是可以修改的。 注意&#xff1a;…...

离散化算法总结

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

【海思SS528 | VO】MPP媒体处理软件V5.0 | VO模块编程总结

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…...

逻辑卷管理器lvm

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

函数声明后的“ - >”是什么?

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

51爱心流水灯32灯炫酷代码

源代码摘自远眺883的文章&#xff0c;大佬是30个灯的&#xff0c;感兴趣的铁汁们可以去看看哦~&#xff08;已取得原作者的许可&#xff09;&#xff1a;基于STC89C51单片机设计的心形流水灯软件代码部分_单片机流水灯代码_远眺883的博客-CSDN博客 由于博主是个小菜鸡&#xff…...

将不同时间点的登录状态记录转化为不同时间段的相同登录状态SQL求解

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

正则表达式与SQL数据库教程

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

HTML_web扩展标签

1.表格标签 2.增强表头表现 4.表格属性&#xff08;实际不常用&#xff09; 结构标签&#xff1a; 合并单元格&#xff1a; 更多请查看主页...

论文阅读:Distributed Initialization for VVIRO with Position-Unknown UWB Network

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

scrapy爬虫中间件和下载中间件的使用

一、关于中间件 之前文章说过&#xff0c;scrapy有两种中间件&#xff1a;爬虫中间件和下载中间件&#xff0c;他们的作用时间和位置都不一样&#xff0c;具体区别如下&#xff1a; 爬虫中间件&#xff08;Spider Middleware&#xff09; 作用&#xff1a; 爬虫中间件主要负…...

手敲单链表,简单了解其运行逻辑

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

Redis RDB

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

Elasticsearch一些函数查询

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

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比

在机器学习的回归分析中&#xff0c;损失函数的选择对模型性能具有决定性影响。均方误差&#xff08;MSE&#xff09;作为经典的损失函数&#xff0c;在处理干净数据时表现优异&#xff0c;但在面对包含异常值的噪声数据时&#xff0c;其对大误差的二次惩罚机制往往导致模型参数…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...