news 2026/8/31 22:33:41

更复杂的代码,为何跑得快了倍?一次Draw Call优化引发的思考

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
更复杂的代码,为何跑得快了倍?一次Draw Call优化引发的思考

莱怀挪促什么是Character?什么是Glyph?Character和Glyph是否一一对应?我们常说的Font又包含哪些东西?如果要自己实现一套文本的分词、测量和布局,又需要理清楚哪些概念?ascent、descent、lineHeight之间的关系是怎么样的?

本文将尽量以简洁易懂的方式来解释以上问题,也可以提前Mark起来,作为日后的速查手册。

二、Character

Character也叫字符,是一个抽象概念,比如字母A、中文你等都可以视为一个字符,它只是一个语义单位,不关心具体长什么样。

三、Glpyh

Glpyh也叫字形,表示字符的绘制方式;一个字符可以有多种方式绘制,比如字母A,可以有不同的大小、粗细、斜体、衬线等,但都是同一个字符;这些不同的绘制方式,都叫字形。

在这里插入图片描述

3.1 Character与Glyph的关系

字符与字形并非一一对应关系,一个字符可以由多个字形表示,比如é可以是e和重音符号′的组合,在一些连字情况下,一个字形也可以代表多个字符,如下:

在这里插入图片描述

四、Font

4.1 Typeface

指一套具有统一设计风格的Font集合,它是一种设计概念,而不是具体的文件

4.2 Font

Font可以理解成Typeface的某个具体实现。

以Helvetica为例:

Typeface:Helvetica

Font:

Helvetica Regular.ttf

Helvetica Bold.ttf

Helvetica Italic.ttf

Helvetica Bold Italic.ttf

4.3 Font Family

Font Family是一组属于同一个Typeface的字体(Fonts),它们共享设计风格,只是字重/宽度/样式不同。

比如:Helvetica是一个Font Family,里面包含字体:

Helvetica Regular

Helvetica Bold

Helvetica Italic

Helvetica Bold Italic

4.4 Font Descriptor

Font Descriptor(字体描述符)是一种属性集合(Font Family、Font Weight、样式 (italic/oblique)、大小等),用来描述或查询一个字体;它不是字体文件,而是一个“过滤条件”或“配置对象”,在 CoreText 里对应 CTFontDescriptor。

Font Descriptor可以用于匹配系统中符合条件的字体,也可以用它来派生一个具体的CTFont,如:

// 这里的 descriptor 只是描述条件,真正的字体对象是 font

let descriptor = CTFontDescriptorCreateWithAttributes([

kCTFontFamilyNameAttribute: "Microsoft YaHei",

kCTFontWeightTrait: 0.8

])

let font = CTFontCreateWithFontDescriptor(descriptor, 14, nil)

4.5 Font Collections

Font Collections是一组字体的集合,通常用于检索和筛选,在 CoreText 里对应CTFontCollection。

它可以包含系统中所有可用字体,也可以按条件过滤出子集,主要用途有:

枚举系统安装的字体

根据 Font Descriptor 找到所有匹配的字体

做字体选择器 UI(比如 Word 里的字体下拉框)

4.6 小结

在这里插入图片描述

4.7 Glyph与Font的关系

简单理解,Font里存储了Glyph的绘制样式,Glyph与Unicode的映射关系等。

Font里有各种各样的表,存储了Unicode code point与GlyphID的映射关系,每个Glyph绘制时的advance width 和left side bearing等,后续会有单独的文章详细解析Font文件内容,这里先理解二者的概念。

五、文字排版的基本概念

基本概念 解释

metrics 由字体设计师提供,用于描述每个Glyph周围的间距

advance width 前进宽度,基线方向到下一个Glyph origin的距离,或者理解为字形绘制完后,光标应该前进多少距离

left-side bearing Glyph origin与Glyph左侧的间距

right-side bearing Glyph右侧与advance width终点的距离

ascent Glyph origin到Font中最高Glyph的顶部距离

descent Glyph origin到Font中最低Glyph的底部距离

bounding box

bounding rectangle 包含Glyph可视区域(注意非advance width)最小rect

kerning 通常,Glyph一般按advance width排列,但为了提高可读性,通常会引入kerning来扩大或缩小两个glyph之间的间距,比如W和A:

在这里插入图片描述

leading/linegap line之间的添加的距离

lineHeight lineHeight = ascent + descent + leading

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/31 22:33:19

隐私保护手机推荐排行榜:这五款守护数字生活

在移动互联网深度融入日常的今天,智能手机已成为承载个人隐私与敏感数据的核心终端。从生物识别信息到支付凭证,每一次触屏操作都在产生数据足迹。当AI技术让手机变得更“懂你”的同时,如何在智能体验与隐私安全之间取得平衡,成为…

作者头像 李华
网站建设 2026/8/30 0:45:29

PT153S方寸微 千兆网卡芯片 优势替代RTL8153 替代AX88179 国产pin to pin瑞昱

PT153 S 是方寸微电子自主研发的一款全国产化 USB 千兆网卡芯片,该芯片具有功能丰富 、性能强劲、功耗低等特点, 可广泛应用于 USB 千兆网卡、扩展坞、 PC、嵌入式工业主板等 众多电子产品。该芯片集成国产 32 位高性能 RISC-V CPU,并集成国产…

作者头像 李华
网站建设 2026/8/20 22:51:20

React Hooks 闭包陷阱:我被 useEffect 依赖项坑了3次后终于搞懂了

React Hooks 闭包陷阱:我被 useEffect 依赖项坑了3次后终于搞懂了 说实话,我第一次用 React Hooks 的时候,内心是拒绝的。明明看起来很简单的代码,怎么跑起来就不对劲了?特别是 useEffect,简直是我的噩梦。…

作者头像 李华
网站建设 2026/8/29 22:14:51

路由器--SMP(软件制作平台)语言基础知识之七十七

除了两台电脑直连,其他电脑网络连接都需要路由器,如果把电脑看作成马路两边的建筑物,马路看作成网络,那么路由器就可以看作成红绿灯。 路由器是一种连接两个或多个网络的硬件设备,它能读取数据包中的地址信息&#xff…

作者头像 李华
网站建设 2026/8/25 3:34:43

Python基于flask的酒店客房管理系统_l6x3l8be

目录核心功能模块设计技术栈选型开发与测试流程开发技术路线源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!以下是基于Flask的酒店客房管理系统(项目标识_l6x3l8be)的实现计划,分为核心模块、技术选型和…

作者头像 李华