更复杂的代码,为何跑得快了倍?一次Draw Call优化引发的思考 📅 发布时间:2026/7/15 18:36:29 👁️ 浏览次数: 莱怀挪促什么是Character什么是GlyphCharacter和Glyph是否一一对应我们常说的Font又包含哪些东西如果要自己实现一套文本的分词、测量和布局又需要理清楚哪些概念ascent、descent、lineHeight之间的关系是怎么样的本文将尽量以简洁易懂的方式来解释以上问题也可以提前Mark起来作为日后的速查手册。二、CharacterCharacter也叫字符是一个抽象概念比如字母A、中文你等都可以视为一个字符它只是一个语义单位不关心具体长什么样。三、GlpyhGlpyh也叫字形表示字符的绘制方式一个字符可以有多种方式绘制比如字母A可以有不同的大小、粗细、斜体、衬线等但都是同一个字符这些不同的绘制方式都叫字形。在这里插入图片描述3.1 Character与Glyph的关系字符与字形并非一一对应关系一个字符可以由多个字形表示比如é可以是e和重音符号′的组合在一些连字情况下一个字形也可以代表多个字符如下在这里插入图片描述四、Font4.1 Typeface指一套具有统一设计风格的Font集合它是一种设计概念而不是具体的文件4.2 FontFont可以理解成Typeface的某个具体实现。以Helvetica为例TypefaceHelveticaFontHelvetica Regular.ttfHelvetica Bold.ttfHelvetica Italic.ttfHelvetica Bold Italic.ttf4.3 Font FamilyFont Family是一组属于同一个Typeface的字体Fonts它们共享设计风格只是字重/宽度/样式不同。比如Helvetica是一个Font Family里面包含字体Helvetica RegularHelvetica BoldHelvetica ItalicHelvetica Bold Italic4.4 Font DescriptorFont Descriptor字体描述符是一种属性集合Font Family、Font Weight、样式 (italic/oblique)、大小等用来描述或查询一个字体它不是字体文件而是一个“过滤条件”或“配置对象”在 CoreText 里对应 CTFontDescriptor。Font Descriptor可以用于匹配系统中符合条件的字体也可以用它来派生一个具体的CTFont如// 这里的 descriptor 只是描述条件真正的字体对象是 fontlet descriptor CTFontDescriptorCreateWithAttributes([kCTFontFamilyNameAttribute: Microsoft YaHei,kCTFontWeightTrait: 0.8])let font CTFontCreateWithFontDescriptor(descriptor, 14, nil)4.5 Font CollectionsFont 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 boxbounding rectangle 包含Glyph可视区域注意非advance width最小rectkerning 通常Glyph一般按advance width排列但为了提高可读性通常会引入kerning来扩大或缩小两个glyph之间的间距比如W和A在这里插入图片描述leading/linegap line之间的添加的距离lineHeight lineHeight ascent descent leading
TinyVue skills使用指南 本文由体验技术团队Kagol原创。 一个月前,有用户建议 TinyVue 出几个 Skills,方便 AI 编程。 必须安排上! 目前 TinyVue 组件库和 TinyRobot AI 对话组件均已支持 Agent Skills,你可以在支持 Skills 的 IDE(比如 VS… 2026/7/12 5:02:46
实测对比后AI论文软件,千笔 VS Checkjie,研究生写作首选! 随着人工智能技术的迅猛迭代与普及,AI辅助写作工具已逐步渗透到高校学术写作场景中,成为研究生完成毕业论文不可或缺的辅助手段。越来越多面临毕业论文压力的学生,开始依赖各类AI工具简化写作流程、提升创作效率。但与此同时,市场… 2026/7/13 1:50:20
sqli-labs-master第九关 1、寻找注入点1’ and 11--1’ and 12--页面只显示 You are in..... 无回显位判断为时间盲注2、注入数据库爆破库长?id1 and if(length(database())>7, sleep(5), 1) --根据库名长度爆库名?id1 and if(ascii(substr(database(),1,1))115, sleep(5), 1) --标蓝部分的为1到… 2026/7/13 16:11:43
vscode-使用sftp插件上传文件至远程服务器 sftp.json 配置 1. 前置条件:1)vscode中下载 SFTP 插件;2)在 vscode 中打开待同步的本地项目路径,快捷键 CtrlShiftP 打开命令面板,输入 SFTP:Config,点击后即可生成 sftp.json 文件:2.文… 2026/7/15 18:32:16
Java 转大模型开发:把落地步骤拆成清单 聊《我用Java经验做了次 AI 项目,最先失效的是旧方法》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&… 2026/7/15 18:30:16
数据科学项目管理的4P框架:问题锚定、角色协同、迭代节奏与价值验证 1. 项目概述:为什么数据科学项目管理不能照搬传统PM方法“数据科学项目管理”这六个字,听起来像是把PMP知识体系往Jupyter Notebook上一贴就完事了——我刚带第一个AI团队时也这么想。结果三个月过去,项目卡在模型验证环节动弹不得࿰… 2026/7/15 18:30:16
Numpy进阶实战:广播、索引与迭代三大核心技能在线闯关解析 1. 广播机制:让不同形状的数组和谐共处第一次接触Numpy广播时,我盯着两个形状完全不同的数组相加的结果看了足足十分钟——这完全违背了我对数学运算的认知。但当我真正理解广播机制后,才发现这是数据处理中最优雅的设计之一。广播的核心思想… 2026/7/15 18:28:15
高速信号完整性设计:DS280MB810线性中继器应用与调优指南 1. 项目概述:为什么我们需要DS280MB810? 在25G/28G甚至更高速率的数字通信系统里,信号完整性工程师最头疼的问题之一,就是信号在PCB走线或电缆里“跑着跑着就散了”。这可不是比喻,而是物理现实——高频信号在传输介质… 2026/7/15 18:26:14
CC3235x无线MCU外设驱动与低功耗设计实战指南 1. 项目概述:深入CC3235x的模拟与数字世界 在物联网和嵌入式设备开发中,我们常常面临一个核心矛盾:如何让一个集成了复杂无线通信功能的微控制器(MCU),还能高效、精准地处理来自真实世界的模拟信号… 2026/7/15 18:26:14
行星减速机的工作原理是什么?从齿轮运动关系到减速比计算 一、行星齿轮机构的组成 标准行星齿轮机构主要包括: 太阳轮; 行星轮; 内齿圈; 行星架。 太阳轮位于机构中心。 多个行星轮围绕太阳轮均匀布置,行星轮内侧与太阳轮外啮合,外侧与内齿圈内啮合。 行星轮通过轴… 2026/7/15 0:03:00
阅读Java开源框架源码的心得分享! 前几日闲来无事有幸看到了一位博主分享自己阅读开源框架源码的心得,看了之后也引发了我的一些深度思考。我们为什么要看源码?我们该怎么样去看源码? 其中前者那位博主描述的我觉得很全了(如下图所示),就不做… 2026/7/15 0:03:00
【LINUX】驱动 【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】 2026/7/15 0:07:01
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/13 8:31:55
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/14 18:25:04
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/14 5:09:41