顶点优化指南:省内存60%的秘诀
一、先理解一个顶点里装了什么很多人以为顶点 一个3D坐标点 实际上一个顶点携带【一堆属性数据】 一个顶点(Vertex)包含 ┌─────────────────────────────────────┐ │ Position(位置) : 3个float 12字节 │ ← 必须 │ Normal(法线) : 3个float 12字节 │ ← 光照用 │ Tangent(切线) : 4个float 16字节 │ ← 法线贴图用 │ UV0(主纹理坐标) : 2个float 8字节 │ ← 贴图用 │ UV1(第二套UV) : 2个float 8字节 │ ← lightmap用 │ Color(顶点色) : 4个byte 4字节 │ ← 顶点着色用 │ BoneWeight(骨骼) : ... │ ← 蒙皮动画用 └─────────────────────────────────────┘ ↓ 一个完整顶点可能 60 字节内存计算Mesh内存 ≈ 顶点数 × 每顶点字节数 10000顶点 × 60字节 600KB 10000顶点 × 精简到28字节 280KB ↓ 省一半以上 顶点数越多精简收益越大核心思路不是每个网格都需要全部属性用不到的属性去掉直接减少每个顶点的字节数。二、各顶点属性的作用与去除条件1. Position位置— 永远保留顶点的3D坐标网格的骨架 → 绝对不能去去了就没网格了2. Normal法线— 光照相关作用决定表面朝向用于计算光照明暗 ┌──────────────────────────────────┐ │ 有法线光照下明暗自然、有立体感 │ │ 无法线无法正确计算光照 │ └──────────────────────────────────┘ 【可去除】的情况 ├── 纯色/自发光物体(不受光照) ├── UI元素(通常不参与光照) ├── 用了不需要法线的特殊shader └── 2D精灵 【必须保留】 └── 任何需要光照的3D物体(绝大多数)3. Tangent切线— 法线贴图相关作用配合Normal构成切线空间用于法线贴图(Normal Map) 法线贴图 用贴图模拟表面凹凸细节 ↓ 需要 切线空间 Normal Tangent 一起定义 ↓ 没有Tangent → 法线贴图无法正确工作 ┌──────────────────────────────────┐ │ Tangent占16字节是较大的一块 │ └──────────────────────────────────┘ 【可去除】的情况★常见优化点★ ├── 材质没用法线贴图(Normal Map) ├── 简单材质(纯色、只有主贴图) └── 大部分场景道具其实不用法线贴图 【必须保留】 └── 用了法线贴图的材质(角色、精细物体)实战很多物体用了简单材质却带着Tangent去掉能省16字节/顶点收益明显。4. UV0主纹理坐标— 通常保留作用贴图怎么贴到模型上的坐标映射 有贴图的物体都需要UV0 ↓ 【可去除】纯色无贴图物体(极少) 【保留】绝大多数(要贴图就要UV)5. UV1 / UV2第二套UV— Lightmap相关作用主要用于光照贴图(Lightmap)的独立UV展开 为什么需要第二套UV 主UV(UV0)贴纹理可能重叠/平铺 Lightmap UV(UV1)烘焙光照必须不重叠 ↓ 两者需求冲突 → 用独立的第二套UV ┌──────────────────────────────────┐ │ 【可去除】的情况★常见★ │ │ ├── 不用烘焙光照(实时光照/无光照) │ │ ├── 动态物体(不参与lightmap烘焙) │ │ └── 移动端很多不用lightmap的物体 │ ├──────────────────────────────────┤ │ 【必须保留】 │ │ └── 参与光照烘焙的静态物体 │ └──────────────────────────────────┘6. Color顶点色— 顶点着色相关作用给每个顶点存一个颜色用于 ├── 顶点级着色(渐变、遮罩) ├── 混合多张贴图的权重 └── 某些特效 【可去除】不用顶点色的物体(大部分) 【保留】用顶点色做混合/特效的7. BoneWeight骨骼权重— 蒙皮动画作用骨骼动画中顶点受哪些骨骼影响、影响多少 【只有】SkinnedMeshRenderer(蒙皮网格)需要 ↓ 静态物体(MeshRenderer)不该有这个三、Mesh Compression压缩原理前面是去掉整个属性这里是降低保留属性的精度。核心用更少的位表示数值默认每个数值用 float(32位) 存储 压缩用更少的位数近似表示 例位置坐标 未压缩float 32位精度极高 压缩可能用16位半精度精度降低但省一半四个档位┌──────────┬────────────────────────────────┐ │ Off │ 不压缩全精度float最大最准 │ ├──────────┼────────────────────────────────┤ │ Low │ 轻度压缩精度损失小 │ ├──────────┼────────────────────────────────┤ │ Medium │ 中度压缩 │ ├──────────┼────────────────────────────────┤ │ High │ 高度压缩最省但精度损失明显 │ └──────────┴────────────────────────────────┘ 压缩不同数据用不同精度 ├── Position影响形状压狠了会变形/抖动 ├── Normal/Tangent影响光照损失影响明暗 └── UV影响贴图压狠了贴图错位压缩的代价精度损失表现位置精度损失 模型顶点位置量化到网格点上 → 大模型可能出现顶点抖动、缝隙 → 精细模型慎用High UV精度损失 → 贴图可能轻微错位、接缝 Normal精度损失 → 光照明暗过渡不够平滑⚠️注意Mesh Compression 是存储压缩磁盘/传输小加载到运行时内存里通常还是解压状态。它主要减小包体运行时内存收益有限。真正省运行时内存的是去掉属性。四、关键区分两种优化的不同收益┌────────────────┬──────────┬──────────┐ │ │ 包体(磁盘) │ 运行时内存│ ├────────────────┼──────────┼──────────┤ │ Mesh Compression│ ↓↓ 明显 │ ~ 有限 │ │ (降精度) │ │ │ ├────────────────┼──────────┼──────────┤ │ 去除顶点属性 │ ↓ 一些 │ ↓↓ 明显 │ │ (删Normal等) │ │ │ └────────────────┴──────────┴──────────┘ 想省包体 → Mesh Compression 想省运行时内存 → 去除不用的属性 ★ 两者可以结合用五、实战如何去除顶点属性1. 模型导入设置ModelImporter选中模型 → Inspector Normals ├── Import用模型自带法线 ├── CalculateUnity计算 └── None不要法线 ← 去除 Tangents ├── Import/Calculate └── None不要切线 ← 去除(不用法线贴图时) Blend Shapes不用可关 Optimize Mesh优化顶点顺序(GPU缓存友好)2. 代码检查网格的属性Meshmesh...;Debug.Log($顶点数:{mesh.vertexCount});Debug.Log($有法线:{mesh.normals.Length0});Debug.Log($有切线:{mesh.tangents.Length0});Debug.Log($有UV2:{mesh.uv2.Length0});Debug.Log($有顶点色:{mesh.colors.Length0});// 估算每顶点大小3. AssetPostprocessor 自动化publicclassMeshImporter:AssetPostprocessor{voidOnPreprocessModel(){varimporterassetImporterasModelImporter;// 场景道具默认不要切线(省16字节/顶点)if(assetPath.Contains(/Props/)){importer.importTangentsModelImporterTangents.None;}// 优化网格importer.optimizeMeshPolygonstrue;importer.optimizeMeshVerticestrue;}}六、决策速查表根据物体类型决定保留哪些属性┌──────────────┬────┬────┬────┬────┬────┬─────┐ │ 物体类型 │Pos │Norm│Tang│UV0 │UV1 │Color│ ├──────────────┼────┼────┼────┼────┼────┼─────┤ │ 受光普通模型 │ ✅ │ ✅ │ ? │ ✅ │ ? │ ? │ │ 用法线贴图 │ ✅ │ ✅ │ ✅ │ ✅ │ ? │ ? │ │ 静态烘焙光照 │ ✅ │ ✅ │ ? │ ✅ │ ✅ │ ? │ │ 纯色/自发光 │ ✅ │ ? │ ❌ │ ? │ ❌ │ ? │ │ UI/2D精灵 │ ✅ │ ❌ │ ❌ │ ✅ │ ❌ │ ? │ │ 简单场景道具 │ ✅ │ ✅ │ ❌ │ ✅ │ ❌ │ ❌ │ └──────────────┴────┴────┴────┴────┴────┴─────┘ ✅需要 ❌可去 ?看需求 最常见的优化 1. 去Tangent(没用法线贴图) ← 收益大(16字节) 2. 去UV2(不烘焙光照) 3. 去Color(不用顶点色)七、常见误区误区真相“Mesh Compression能省运行时内存”主要省包体运行时通常解压“所有属性都留着保险”每个属性都占内存用不到就浪费“去了法线也能光照”不行法线是光照基础“Tangent必须有”只有法线贴图才需要很多物体不用“Compression High随便用”精度损失可能导致模型抖动/变形“UV1和UV0一样”UV1多用于lightmap需求不同八、核心要点总结顶点数据精简两条路 【路径1去除不用的属性】(省运行时内存 ★) 一个顶点含多种属性各自的去留 ├── Position必须留 ├── Normal受光就留不受光可去 ├── Tangent用法线贴图才留 ← 常见可去(16字节) ├── UV0有贴图就留 ├── UV1/UV2烘焙光照才留 ← 常见可去 ├── Color用顶点色才留 ← 常见可去 └── BoneWeight蒙皮动画才有 【路径2Mesh Compression】(省包体) 降低保留属性的数值精度(Off/Low/Med/High) ├── 省磁盘/传输 ├── 运行时通常解压内存收益有限 └── 压太狠会变形/抖动精细模型慎用High 关键区分 ├── 省内存 → 去属性 ├── 省包体 → Compression └── 两者可结合 实战 ├── ModelImporter设置Normals/Tangents为None ├── AssetPostprocessor自动化 └── 最常见收益去Tangent 去UV2 去Color一句话一个顶点携带位置、法线、切线、UV、顶点色等多种属性每种都占字节。去除用不到的属性如没用法线贴图就去切线、不烘焙光照就去UV2能直接减小运行时内存而Mesh Compression是降低数值精度主要减小包体运行时内存收益有限——两者针对不同目标可结合使用。

相关新闻

为什么 Read/Write Enabled 开启会导致内存翻倍

为什么 Read/Write Enabled 开启会导致内存翻倍

一、核心认知:数据存在哪里? 要理解这个问题,先搞清楚一个关键事实: 资源(贴图/网格)最终是给【GPU】用来渲染的 但数据从磁盘加载时,先经过【CPU内存(RAM)】两块内存是分开的: ┌────────────…

2026/10/25 20:21:27 阅读更多 →
n8n高危RCE漏洞分析与安全防护指南

n8n高危RCE漏洞分析与安全防护指南

1. 漏洞事件概述n8n工作流自动化平台近期被曝存在CVSS评分10分的严重安全漏洞,该漏洞同时影响自托管和云服务版本。作为一款流行的开源自动化工具,n8n被广泛应用于企业业务流程自动化场景,此次漏洞的发现引发了开发者社区的高度关注。2. 漏洞…

2026/10/25 20:21:28 阅读更多 →
如何将微信聊天记录永久保存并深度分析?WeChatMsg实用方案详解

如何将微信聊天记录永久保存并深度分析?WeChatMsg实用方案详解

如何将微信聊天记录永久保存并深度分析?WeChatMsg实用方案详解 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/…

2026/10/25 7:51:14 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/26 12:00:21 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/25 22:36:10 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/26 4:52:12 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/26 12:00:21 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/26 5:00:37 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/26 3:16:46 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 12:00:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/25 13:21:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/26 8:34:37 阅读更多 →