2312skia,10构建

介绍

Skia图形库可来绘画文本,几何图形和图像:

带透视的3x3矩阵*抗锯齿,透明度,滤镜*着色器,传输模式,掩码过滤,路径特效,子像素文本
Skia的设备后端目前包括:
光栅*OpenGL*PDF*XPS*SVG*及(用来录制,然后回放到另一个Canvas中的)图片

构建

确保已先按说明下载Skia
SkiaGN来配置构建.可参考这篇来构建

is_official_build和第三方依赖项

Skia多数用户应该设置is_official_build=true,而开发者应按false为默认值.

优化版本没有调试符号,用普通库搜索路径动态链接到其第三方依赖项.

相比下,面向开发者默认版本是未优化构建,有完整调试符号,所有第三方依赖项从源码构建并嵌入到libskia中.这就是所有手动和自动测试方式.

Skia提供了多种使用第三方库的功能,如libpng,libwebplibjpeg-turbo来解码图像,或ICUsftnly解码子集字体.

所有这些第三方依赖项都是可选的,并可通过GN像对foo,用skia_use_foo参数来控制.

如果启用了skia_use_foo,则启用skia_use_system_foo通过把它链接系统路径上的头文件和库中,来生成Skia.默认,is_official_build=true启用所有skia_use_system_foo.
如果需要,可用extra_cflagsextra_ldflags添加包含路径或库路径.

支持和首选的编译器

虽然Skia应用GCC,MSVC和其他编译器编译,但使用Clang编译Skia软件后端中的许多例程时,运行速度最快.

如果依赖软光栅化,图像解码或颜色空间转换,并使用Clang外的编译器编译Skia,会看到性能明显下降.
Skia使用C++语言功能(使用-std=c++17标志编译),因此需要兼容C++17的编译器.

--args='cc="clang" cxx="clang++"'

为使用指定的cccxx调用.

如果未在gn参数中指定cccxx,则Skia默认为ccc++.在许多平台上,这一般是默认的GCC,而不是Clang.

快速入门

运行gn gen以生成构建文件.按gn gen的参数,传递构建目录名,并可选地传递--args=来配置构建类型.

要在名为out/Static构建目录中,按静态库构建Skia:

bin/gn gen out/Static --args='is_official_build=true'

要在名为out/Shared构建目录中,按共享库(DLL)构建Skia,请如下:

bin/gn gen out/Shared --args='is_official_build=true is_component_build=true'

如果没有bin/gn,请确保已运行:

python3 tools/git-sync-deps
//窗口下,用python.exe

可用构建参数列表,查看gn/skia.gni,或运行:

bin/gn args out/Debug --list
//窗口下,用gn.exe

GN允许多个构建目录共存;每个版本都可按需单独配置.如:

bin/gn gen out/Debug
bin/gn gen out/Release  --args='is_debug=false'
bin/gn gen out/Clang    --args='cc="clang" cxx="clang++"'
bin/gn gen out/Cached   --args='cc_wrapper="ccache"'
bin/gn gen out/RTTI     --args='extra_cflags_cc=["-frtti"]'

生成构建文件后,运行Ninja来编译和链接Skia:

ninja -C out/Static

如果缺少某些头文件,请安装相应依赖项:

tools/install_dependencies.sh

拉取更改并重新生成,请如下:

git pull
python tools/git-sync-deps
ninja -C out/Static

安卓

要构建适合安卓Skia,需要AndroidNDK.

如果没有NDK但有权访问CIPD,则可用以下命令之一来取我们的机器人使用的NDK:

./bin/fetch-sk
./bin/sk asset download android_ndk_linux /tmp/ndk     # Linux上
./bin/sk asset download android_ndk_darwin /tmp/ndk    # Mac上
./bin/sk.exe asset download android_ndk_windows C:/ndk # Windows上

生成GN构建文件时,传递路径ndk和期望target_cpu:

bin/gn gen out/arm   --args='ndk="/tmp/ndk" target_cpu="arm"'
bin/gn gen out/arm64 --args='ndk="/tmp/ndk" target_cpu="arm64"'
bin/gn gen out/x64   --args='ndk="/tmp/ndk" target_cpu="x64"'
bin/gn gen out/x86   --args='ndk="/tmp/ndk" target_cpu="x86"'

其他参数,如is_debugis_component_build继续工作.调整ndk_api可让你访问较新的安卓功能,如Vulkan.
要在安卓设备上测试,请推送二进制文件和资源过来,然后照常运行.如发现bin/droid很方便.

ninja -C out/arm64
adb push out/arm64/dm /data/local/tmp
adb push resources /data/local/tmp
adb shell "cd /data/local/tmp; ./dm --src gm --config gl"

Chrome操作系统

要为armChromeOS设备交叉编译Skia,需要如下条件:
1,Clang4或更高版本
2,一个armhf sysroot
3,要链接的arm,chromebook上的(E)GLlib文件.
要为x86ChromeOS设备编译Skia,只需要Clanglib文件.

如果有权访问CIPD,则可如下取这些内容:

./bin/sk asset download clang_linux /opt/clang
./bin/sk asset download armhf_sysroot /opt/armhf_sysroot
./bin/sk asset download chromebook_arm_gles /opt/chromebook_arm_gles
./bin/sk asset download chromebook_x86_64_gles /opt/chromebook_x86_64_gles

如果无权使用这些资产,见armhf_sysroot,chromebook_arm_gleschromebook_x86_64_glesREADME.md文件,了解如何创建这些资产.
1
2
3

文件就位后,生成类似以下内容的GN参数:

//#ARM
cc= "/opt/clang/bin/clang"
cxx = "/opt/clang/bin/clang++"
extra_asmflags = ["--target=armv7a-linux-gnueabihf","--sysroot=/opt/armhf_sysroot/","-march=armv7-a","-mfpu=neon","-mthumb",
]
extra_cflags=["--target=armv7a-linux-gnueabihf","--sysroot=/opt/armhf_sysroot","-I/opt/chromebook_arm_gles/include","-I/opt/armhf_sysroot/include/","-I/opt/armhf_sysroot/include/c++/4.8.4/","-I/opt/armhf_sysroot/include/c++/4.8.4/arm-linux-gnueabihf/","-DMESA_EGL_NO_X11_HEADERS","-funwind-tables",
]
extra_ldflags=["--sysroot=/opt/armhf_sysroot","-B/opt/armhf_sysroot/bin","-B/opt/armhf_sysroot/gcc-cross","-L/opt/armhf_sysroot/gcc-cross","-L/opt/armhf_sysroot/lib","-L/opt/chromebook_arm_gles/lib","--target=armv7a-linux-gnueabihf",
]
target_cpu="arm"
skia_use_fontconfig = false
skia_use_system_freetype2 = false
skia_use_egl = true
//# x86_64
cc= "/opt/clang/bin/clang"
cxx = "/opt/clang/bin/clang++"
extra_cflags=["-I/opt/clang/include/c++/v1/","-I/opt/chromebook_x86_64_gles/include","-DMESA_EGL_NO_X11_HEADERS","-DEGL_NO_IMAGE_EXTERNAL",
]
extra_ldflags=["-stdlib=libc++","-fuse-ld=lld","-L/opt/chromebook_x86_64_gles/lib",
]
target_cpu="x64"
skia_use_fontconfig = false
skia_use_system_freetype2 = false
skia_use_egl = true

如常,使用ninja编译dm(或其他可执行文件).
通过ssh推送二进制文件chromebook,并使用glesGPU配置如常运行dm.

默认,按noexec标记大多数Chromebook主目录分区.为避免"拒绝权限"错误,请如下:

sudo mount -i -o remount,exec /home/chronos

Mac

Mac用户想传递--ide=xcodebin/gn gen来生成Xcode项目.
默认,MacGN版本假定使用IntelCPU.如果要针对AppleSilicon(M1及更高版本)构建,请添加一个gn参数来设置target_cpu="arm64":

bin/gn gen out/AppleSilicon --args='target_cpu="arm64"'

Google员工应参考go/skia-corp-xcode.

Python

Apple提供的Python版本已过时了几个版本,而且周知,其与构建系统的交互很差.建议从https://www.python.org/downloads/安装最新的Python正式版本.然后运行"Applications/Python3.11/InstallCertificates.command".

iOS系统

运行GN以生成构建文件.设置target_os="ios"以针对iOS构建.默认值为target_cpu="arm64".要使用iOS模拟器,请设置ios_use_simulator=true并设置target_cpuMac架构.
IntelMac上,单独设置target_cpu="x64"也会针对iOS模拟器.

bin/gn gen out/ios64  --args='target_os="ios"'
bin/gn gen out/ios32  --args='target_os="ios" target_cpu="arm"'
bin/gn gen out/iossim-apple --args='target_os="ios" target_cpu="arm64" ios_use_simulator=true'
bin/gn gen out/iossim-intel --args='target_os="ios" target_cpu="x64"'

这还会打包(并为设备签名)iOS测试二进制文件.默认为Google签名标识和预配置文件.要使用其他参数,请设置GNskia_ios_identity参数,以匹配代码签名标识,并及skia_ios_profile来匹配预配置文件名,如

skia_ios_identity=".*Jane Doe.*"
skia_ios_profile="iPad Profile"`

可在命令行上键入security find-identity来查找标识列表.在Apple开发者网站上提供预配置文件名.
或,skia_ios_profile也可以是mobileprovision文件的绝对路径.
如果缺少Google签名标识或配置文件,则要通读go/appledev.

对已签名的包,用ios-deploy安装和运行它们:

ios-deploy -b out/Debug/dm.app -d --args "--match foo"

或,可传递--ide=xcodebin/gn gen来生成Xcode项目.如果使用的是Xcode版本10或更高版本,则可能需要转到项目设置,并验证构建系统:是否设置为LegacyBuildSystem.

可设置ios_min_target参数来部署早于当前SDK设备的操作系统:

ios_min_target = "<major>.<minor>"

其中<major>.<minor>是设备上的iOS版本,如12.011.4.

窗口

Skia可用VS20172019Windows上构建.如果GN找不到,它会打印一条错误消息.此时,可用win_vc来传递VC路径给GN.

可用免费的VS20172019生成工具编译Skia.
机器使用打包的2019年工具链,Google员工可如下下载:

./bin/sk.exe asset download win_toolchain C:/toolchain

然后,可设置GN参数,来传递VCSDK路径给GN:

win_vc = "C:\toolchain\VC"
win_sdk = "C:\toolchain\win_sdk"

该工具链是用target_cpu="x86"设置支持32位构建的唯一方式.

Skia构建假定PATHEXT环境变量包含".EXE".

强烈推荐:用clang-cl构建

Skia使用仅在用clang构建Skia时优化而生成的代码.其他编译器则是通用的未优化代码.

光设置gncccxx参数,并不能用clang-cl构建.在窗口上会忽略这些变量.相反,设置clang_win变量为LLVM安装目录.
如果把从在此下载的构建预的LLVM安装到如下:

clang_win = "C:\Program Files\LLVM"

遵循标准的Windows路径规范,而不是MinGW约定(如,C:\Program Files\LLVM而不是/c/ProgramFiles/LLVM).

VS方法

如果使用VS,则可传递--ide=vsbin/gngen以生成all.sln.在配置的GN目录中指定该方法,且只会构建/运行该配置.

如果要支持多个GN配置的VS方法,可用助手脚本.它要求所有GN目录都在out目录中.首先,如常创建所有GN配置.
对每个bin/gn gen,传递--ide=vs.然后:

python3 gn/gn_meta_sln.py
//窗口用,python.exe

这样创建了新的特化输出目录和out/sln/skia.sln方法文件.它为每个GN配置提供一个方法配置,并支持构建和运行它.
它还根据所选方法配置中的预处理定义,调整非活动代码块的语法高亮.

窗口ARM64

ARM上有对Windows10的早期实验性支持.这目前需要(最新版本的)MSVC,及VS安装程序中ARM64单个组件的VisualC++编译器和库.
Google员工来说,win_toolchain资产包括ARM64编译器.
要使用该工具链,请设置target_cpuGN参数为"arm64".注意,ARM上的Windows10不支持OpenGL,因此会存根SkiaGL后端,而无法正常工作.支持ANGLE:

bin/gn gen out/win-arm64 --args='target_cpu="arm64" skia_use_angle=true'

这生成一个可在DM中使用软件或ANGLE后端的Skia版本.Viewer仅在使用--backendangle启动时有效,因为软件后端试使用OpenGL来显示窗口内容.

CMake

添加了一个GN-to-CMake转换器,主要针对喜欢CMake项目描述的IDE.

bin/gn gen out/config --ide=json --json-ide-script=../../gn/gn_to_cmake.py

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/196769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Huawei FusionSphere FusionCompte FusionManager

什么是FusionSphere FusionSphere 解决方案不独立发布软件&#xff0c;由各配套部件发布&#xff0c;请参 《FusionSphere_V100R005C10U1_版本配套表_01》。 目前我们主要讨论FusionManager和FusionCompute两个组件。 什么是FusionCompte FusionCompute是华为提供的虚拟化软…

初识动态规划算法(题目加解析)

文章目录 什么是动态规划正文力扣题第 N 个泰波那契数三步问题使用最小花费爬楼梯 总结 什么是动态规划 线性动态规划&#xff1a;是可以用一个dp表来存储内容&#xff0c;并且找到规律存储,按照规律存储。让第i个位置的值等于题目要求的答案 >dp表&#xff1a;dp表就是用一…

SpringBoot——嵌入式 Servlet容器

一、如何定制和修改Servlet容器的相关配置 前言&#xff1a; SpringBoot在Web环境下&#xff0c;默认使用的是Tomact作为嵌入式的Servlet容器&#xff1b; 【1】修改和server相关的配置&#xff08;ServerProperties实现了EmbeddedServletContainerCustomizer&#xff09;例如…

Python 中 ConnectionRefusedError: [Errno 111] Connection Refused 错误

此错误表明客户端无法连接到服务器脚本系统上的端口。 既然能ping通服务器&#xff0c;应该不会吧。 这可能是由多种原因引起的&#xff0c;例如到目的地的路由不正确。 第二种可能性是您的客户端和服务器之间有防火墙&#xff0c;它可能在服务器上&#xff0c;也可能在客户端…

欢迎回到 C++ - 现代 C++(心得-壹)

原文链接欢迎回到 C - 现代 C | Microsoft Learn 这里先是讲了现代c的优势&#xff0c;其相对于其他编程语言有快速、高效。 相对于其他语言&#xff0c;该语言更加灵活&#xff0c;跨平台&#xff08;硬件平台&#xff09;性也很强&#xff0c;可以直接访问硬件&#xff0c;虽…

第三方UI组件库的样式修改

一、场景&#xff1a; 一般来说&#xff0c;我们在使用第三方UI组件库&#xff08;如&#xff1a;vant&#xff0c;element-plus等&#xff09;时&#xff0c;UI组件库自带的样式不能满足用户的个性化需求时&#xff0c;就需要我们开发人员自己动手对组件库的局部样式进行修改。…

Robot Grasp[Code with paper]

题目/摘要重点 Deep Object Pose Estimation for Semantic Robotic Grasping of Household Objects 使用合成数据为机器人训练深度神经网络 操纵有望获得几乎无限数量的预标记 训练数据。合成数据一直在弥合所谓的现实差距&#xff0c;因此 在合成数据上训练的网络在暴露于现…

PoE技术详解

标准的五类网线有四对双绞线&#xff0c;IEEE 802.3af和IEEE 802.3at允许两种用法&#xff1a;通过空闲线对供电或者数据线对供电。IEEE 802.3bt允许通过空闲线对供电、通过数据线对供电或者空闲线对和数据线对一起供电&#xff0c;如图16.1所示。 图 16.1 PoE供电线对 当在一…

考研英语语法(三十九)

平行结构-分类 名词&#xff08;词组&#xff09;的平行并列 The English,the Germans,the Dutch and the French were investing in Britains former colony The English ,the Germans ,the Dutch and the French The networked com…

整数的立方和

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

入门指南:使用Element UI构建漂亮的Vue.js应用

文章目录 &#x1f342;引言&#x1f342;安装并引入Element UI&#x1f342;使用Element UI组件&#x1f342;更多常用组件&#x1f341;Button 按钮&#x1f341;Input 输入框&#x1f341;Radio 单选框&#x1f341;Checkbox 多选框&#x1f341;Select 选择器&#x1f341;…

用取样思想一探AIX上进程性能瓶颈

本篇文章也是我在解决客户问题时的一些思路&#xff0c;希望对读者有用。 本文与GDB也与DBX&#xff08;AIX上的调试工具&#xff09;无关&#xff0c;只是用到了前文《GDB技巧》中的思想&#xff1a;取样思想 客户问题&#xff1a; 原始问题是磁盘被占满了&#xff0c;通过…

C++ 系列 第四篇 C++ 数据类型上篇—基本类型

系列文章 C 系列 前篇 为什么学习C 及学习计划-CSDN博客 C 系列 第一篇 开发环境搭建&#xff08;WSL 方向&#xff09;-CSDN博客 C 系列 第二篇 你真的了解C吗&#xff1f;本篇带你走进C的世界-CSDN博客 C 系列 第三篇 C程序的基本结构-CSDN博客 前言 面向对象编程(OOP)的…

Star 10.4k!推荐一款国产跨平台、轻量级的文本编辑器,内置代码对比功能

notepad 相信大家从学习这一行就开始用了&#xff0c;它是开发者/互联网行业的上班族使用率最高的一款轻量级文本编辑器。但是它只能在Windows上进行使用&#xff0c;而且正常来说是收费的&#xff08;虽然用的是pj的&#xff09;。 对于想在MacOS、Linux上想使用&#xff0c;…

不瞒各位,不安装软件也能操作Xmind文档

大家好&#xff0c;我是小悟 作为搞技术的一个人群&#xff0c;时不时就要接收产品经理发过来的思维脑图&#xff0c;而此类文档往往是以Xmind编写的&#xff0c;如果你的电脑里面没有安装Xmind的话&#xff0c;不好意思&#xff0c;是打不开这类后缀结尾的文档。 打不开的话…

TensorRT-LLM保姆级教程(二)-离线环境搭建、模型量化及推理

随着大模型的爆火&#xff0c;投入到生产环境的模型参数量规模也变得越来越大&#xff08;从数十亿参数到千亿参数规模&#xff09;&#xff0c;从而导致大模型的推理成本急剧增加。因此&#xff0c;市面上也出现了很多的推理框架&#xff0c;用于降低模型推理延迟以及提升模型…

即兴语录-即兴小索奇语录

如果你想要实现自己的梦想&#xff0c;就不能害怕失败。因为失败是成功的垫脚石。 谁说失败了就一定是坏事&#xff1f;其实每一次失败都是一次成功的垫脚石。只有经历过失败的人&#xff0c;才能更好地理解成功的滋味。

处理器中的TrustZone之安全状态

在这个主题中&#xff0c;我们将讨论处理器内对TrustZone的支持。其他部分则涵盖了在内存系统中的支持&#xff0c;以及建立在处理器和内存系统支持基础上的软件情况。 3.1 安全状态 在Arm架构中&#xff0c;有两个安全状态&#xff1a;安全状态和非安全状态。这些安全状态映射…

改善你的登录页:登录设计的极致指南!

登录页面相当于产品的立面。无论是网站还是APP&#xff0c;用户打开后&#xff0c;首先映入眼帘的就是登录页面&#xff0c;用户在这里进行下一步的操作。如果登录页面的UI设计错误&#xff0c;界面视觉混乱&#xff0c;往往会在用户详细了解产品之前关闭并离开。希望大家通过这…

【qml入门系列教程】:qml QtObject用法介绍

作者:令狐掌门 技术交流QQ群:675120140 博客地址:https://mingshiqiang.blog.csdn.net/ 文章目录 QtObject 是 Qt/QML 中的一个基础类型,通常用作创建一个没有 UI 的(不渲染任何东西的)纯逻辑对象。可以使用它来组织代码、存储状态或者作为属性和方法的容器。 以下是如何…