UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 | 侑虎科技 - 简谱
type: channel
link: https://blog.uwa4d.com/tag/简谱
items: Unity移动端游戏性能优化简谱之 分门别类地控制运行时内存（下）
items: Unity移动端游戏性能优化简谱之 分门别类地控制运行时内存（上）
items: Unity移动端游戏性能优化简谱之 前言

Unity移动端游戏性能优化简谱之 分门别类地控制运行时内存（下）
type: item
date: 2026-03-20T12:10:00+02:00
description: 《Unity移动端游戏性能优化简谱》从Unity移动端游戏优化的一些基础讨论出发，例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题，并展示了如何使用UWA的性能检测工具确定和解决这些问题。内容包括了性能优化的基本逻辑、UWA性能检测工具和常见性能问题，希望能提供给Unity开发者更多高效的研发方法和实战经验。 今天向大家介绍文章第二部分：资源内存、Mono堆内存等常见游戏内存控制，共13小节，包含了纹理资源、网格资源、动画资源、音频资源、材质资源等多个资源内存以及Mono堆内存等常见的游戏内存控制讲解。 本章包含8-13小节，1-7小节请点击《Unity移动端游戏性能优化简谱之 分门别类地控制运行时内存（上）》。 （全文长约11400字，预计阅读时间约20分钟） 文章第一部分《Unity移动端游戏性能优化简谱之 前言》可戳此回顾，完整内容可前往UWA学堂查看。 8. Render Texture 8.1 渲染分辨率 资源列表中的一些RT资源能反映项目当前的渲染分辨率。对于GPU和渲染模块压力较大的项目，在中低端机型上降低其渲染分辨率是非常直观有效的分级策略。但相关调整比起说影响内存，还是更多地影响GPU片元计算压力和带宽，后文GPU章节会进行更加详细的讨论。 如果一些其他的RT资源分辨率过高也应引起注意，尤其是2048*2048以上的资源。应当排查是否有必要用到如此精细的RT，在低端机上考虑采用更低分辨率的效果。 8.2 抗锯齿 资源列表中展示了RT资源的AA倍数。开启多倍AA会使RT占用内存成倍上升，并对GPU造成压力。建议排查是否有必要开启AA，尤其在中低端机上，可以考虑关闭此效果。 特别的是，在华为部分机型上2倍的AA会失效。即已经造成了性能消耗但没有实际起到抗锯齿效果。 8.3 后处理 一些常见的后处理相关的RT（如Bloom、Blur）是从1/2渲染分辨率开始采样，可以考虑改从1/4开始采样、并减少下采样次数，从而节省内存并降低后处理对渲染的压力。 站在性能优化的角度，在中低端机型上甚至最好分级地关闭各类后处理。围绕一些常见后处理效果的讨论会在下文GPU部分中进一步展开。 8.4 URP下的RT 使用URP时，内存中会多出_CameraColorTexture和_CameraDepthAttachment两份RT资源作为渲染目标，而开启URP相机的CopyDepth和CopyColor设置时会额外产生_CameraDepthTexture和_CameraOpaqueTexture作为中间RT。当资源列表中出现这两种RT时，需要排查确实是否用到CopyDepth和CopyColor，否则应予以关闭以避免不必要的浪费。 9. Shader资源 9.1 ShaderLab Unity 2019.4.20是Shader内存统计方法的一个转折点。在此之前，Shader的内存主要统计在ShaderLab中，而之后则主要统计在Shader资源自身身上。 对于Unity 2019.4.20之前的版本的项目，查看ShaderLab的内存使用Memory Profiler截帧查看。而无论是Shader资源本体还是ShaderLab内存占用过高，都要着手于控制Shader的数量、变体数量和Shader复杂度。 9.2 变体数和复杂度 对于单个Shader资源而言，其内存占用高本质在于其编译后的行数高。因此也可以视为，怎么控制变体的数量和每个变体的平均行数（也就是Shader的复杂度），这两个乘数的问题。 其中，变体数过多是造成一个Shader资源内存占用过大、占用包体过大的主要原因，也是相对比较好和排查和修改的部分。在项目迭代中可能会出现已经被弃用或者没有被实际使用到的关键字，导致变体成倍上升；又或者Shader写的比较复杂，其中一些关键字组合永远不会被用到，从而导致很多变体是多余的。UWA的本地资源检测中提供了Shader检测功能，可以看到变体数量，定位变体数过多的Shader资源。 针对上述情况，Unity提供了回调函数，在项目打AssetBundle包或者Build时线剔除用不到的关键字或关键字组合相关的变体。剔除Shader变体的方法可以参考《Stripping scriptable shader variants》。 而Shader的复杂度同时还涉及到GPU性能相关的优化。具体在后文GPU部分有更加详细的讨论。 9.3 冗余 Shader冗余尤其需要予以关注，Shader的冗余不光导致内存上升，还可能造成重复解析，即运行时不必要的Shader.Parse和Shader.CreateGPUProgram API调用耗时。 一般的做法是，首先使用ShaderVariantCollection这一Unity…

Unity移动端游戏性能优化简谱之 分门别类地控制运行时内存（上）
type: item
date: 2022-06-10T09:10:00+03:00
description: 《Unity移动端游戏性能优化简谱》从Unity移动端游戏优化的一些基础讨论出发，例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题，并展示了如何使用UWA的性能检测工具确定和解决这些问题。内容包括了性能优化的基本逻辑、UWA性能检测工具和常见性能问题，希望能提供给Unity开发者更多高效的研发方法和实战经验。 今天向大家介绍文章第二部分：资源内存、Mono堆内存等常见游戏内存控制，共13小节，包含了纹理资源、网格资源、动画资源、音频资源、材质资源等多个资源内存以及Mono堆内存等常见的游戏内存控制讲解。 本章包含1-7小节，8-13小节请点击《Unity移动端游戏性能优化简谱之 分门别类地控制运行时内存（下）》。 （全文长约11400字，预计阅读时间约20分钟） 文章第一部分《Unity移动端游戏性能优化简谱之 前言》可戳此回顾，完整内容可前往UWA学堂查看。 1. 总览 1.1 运行时内存占用 首先，在讨论内存相关的各项参数和制定标准之前，我们需要先理清在各种性能工具的统计数据中常出现的各种内存参数的实际含义。 在包括UWA在内的多种性能工具中，我们最常见到和关心的PSS（Proportional Set Size）Total内存，其含义为一个进程在RAM中实际使用的空间地址大小，即实际使用的物理内存（比例分配共享库占用的内存，按照进程数等比例划分），也即我们游戏进程的实际运行时内存占用。 不过，有的时候也会出现使用RSS Total参数的工具。它和PSS同样代表实际使用的物理内存，不过包含了共享库占用的全部内存，有时会偏大，参考性相对下降；而共享库内存是不会导致杀进程的。在下文它出现的时候，会额外标记。 当然，在实践过程中这两个值还会受到安卓系统版本、具体硬件机型等因素的影响。 无论如何，游戏运行过程中闪退，或暂时切出（如玩家游戏过程中切到社交软件回复信息）就被杀进程，对玩家体验显然是一种严重的破坏。而在UWA经验中，上述两个现象绝大多数情况下都是过高的运行时内存导致的。 当系统内存触发高占用告警时，系统会根据进程优先级自动终止部分进程以释放内存。这也是许多开发者在闪退日志中看到的Out of Memory（OOM）类型闪退的主要原因。 在系统的进程优先级体系中，包括游戏进程在内的玩家应用通常处于较低的一档；而在同一优先级层级中，内存占用越高的进程，被系统终止的概率也越大。因此，游戏进程往往成为被系统杀死的高风险对象。 由于我们几乎无法在引擎层面对系统进程优先级进行重新调度或调整，因此在实际项目中，控制PSS Total的整体占用，仍然是最常见且最有效的优化手段。 有了这样一个总值，当我们发现总值过高时，就需要予以拆解才能定位到问题。接下来，我们从两个视角来拆解PSS Total： 首先是很多开发者都有在用、相对熟悉的Memory Profiler。该工具对内存的划分和命名也一直在随版本调整，因此本文就比较常用的Memory Profiler 0.7.1和1.1.0版本进行分析，在笔者看来，两者各有千秋，实际使用时甚至经常两个一起用。以下是同一个Snapshot结果在两个不同版本上的解析结果： 0.7.1 老版的Summary界面把内存以三个维度进行拆分，比较清晰。其中还能看到In use和Reserved部分分别占了多少，体现出了预留内存。 但老版的细节分析页整合地较差，甚至Take Example时都能清晰呈现的Manager、SerializedFile等类型都没有区分出来。且还需要自己点击分类、隐藏不需要的字段、按大小排序，才能看到上图这样相对有价值的画面。 1.1.0 新版的Summary将原本最上层相对价值较低的维度删除，反之对五种资源内存做了拆分。但主要问题在于移除了预留值的呈现，全部（甚至包括堆内存的预留值）都被计入了Native。 新版的细节整合页明显要好的多，分类更全面清晰，且已经做好了排序、还有简单的可视化。但上面提到的预留值，包括IL2CPP虚拟机的内存都被算进了Unknown里。在UWA的一些排查经验中，还发现会有个别特殊情况会导致这里的Unknown特别高，比如项目的AssetBundle使用LZMA格式进行打包时。尽管知道是不怎么需要针对性优化的部分，但看到这几百MB的占用总还是比较糟心的；更别说很多开发者不理解这部分占用时产生的困惑了。所以，有时候两个版本都看一下作对比就能发现问题。 接下来我们还是取0.7.1的Summary进行详细介绍。可以看到，在图中的第一部分，Unity把统计到的运行时内存总值（此处Unity抓取了RSS内存）分成了两大部分：Tracked Memory和Untracked Memory。 Tracked Memory为Unity引擎分配的…

Unity移动端游戏性能优化简谱之 前言
type: item
date: 2022-06-08T08:28:00+03:00
description: 《Unity移动端游戏性能优化简谱》是从Unity移动端游戏优化的一些基础讨论出发，例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题，并展示了如何使用UWA的性能检测工具确定和解决这些问题。内容包括了性能优化的基本逻辑、UWA性能检测工具和常见性能问题，希望能提供给Unity开发者更多高效的研发方法和实战经验。 今天向大家介绍第一部分，共五小节。完整内容请前往UWA学堂查看。 玩家眼中的游戏性能 开发者关注的游戏性能 如何确定问题 如何解决问题 如何持续监控性能 前言 1. 玩家眼中的游戏性能 任何一个玩家在游玩游戏过程中都会碰到类似的疑问：为什么我玩一段时间就会闪退？为什么我的游戏这么卡？为什么我的硬件这么烫？为什么移动设备电量下得这么快？ 对于玩家而言，无关手里这款游戏本身的美术是否精良、玩法是否有趣，当上述这些疑问出现时，其游戏体验会自然而然地变差，并不可避免地导致黏性下降。这是每个游戏开发者都不想看到的结果。 而实情是，对于如今的移动端游戏市场而言，国内市面上各类硬件机型性能跨度很大；如果项目要支持海外市场，则往往项目所要承担的性能压力更大。那么，如何让持有不同硬件设备的玩家，尤其是通过中低端设备接触到我们游戏项目的玩家也能顺利流畅地体验游戏内容，就是我们今天讨论的主要话题。 2. 开发者关注的游戏性能 在游戏项目的开发过程中，一个非常常见的现象是：研发团队在新项目的中前期往往把全部精力投入到实现功能中去，而忽略了性能优化的工作；到了游戏中后期甚至临近上线的时候进行测试，才发现项目充斥着大量严重的性能问题、影响到了游戏的正常体验，但却不知道从何改起、时间非常窘迫；再到上线后，受到大量玩家对性能的负面反馈，留存数据也受到影响。 足以见得，性能问题是一款游戏项目重要的生命线，需要开发者树立良好的优化意识和优化知识体系，才能让项目少走弯路。 和玩家视角不同的是，像闪退、卡顿、发热、耗电这种感官层面的性能问题，UWA认为在开发者的视角中应该将其主要分类为内存、CPU、GPU三个大类的问题。本文的主要内容旨在围绕三个大类的常见典型问题进行例举和讨论，从而形成一份Unity移动端游戏性能优化方法论的简谱。 那么，既然已经发现了若干性能问题，如何排查确定问题和解决问题就成了最关键的两个步骤。 3. 如何确定问题 发现了性能问题后的第一大步骤就是确定问题。 举例而言，我们的游戏项目运行时间一长就会闪退，是因为我们的缓存策略做的不好或者存在冗余现象，导致内存不断上升造成的闪退？还是因为我们的美术资源内存控制的不好，几个较大的资源就轻易把整体内存给撑大了？ 又或者我们发现一个游戏场景卡顿严重、帧率很低，是因为这里的同屏渲染面片数和DrawCall数都太高导致渲染模块压力大？还是因为此处的UI过于复杂且变化频繁造成的更新耗时？ 还或者我们感到手里的手机烫的惊人，是不是因为当前场景GPU压力过大，我们在当前机型上做的分级策略并不合适？ 以上只是众多千奇百怪层出不穷的性能问题中的寥寥几点。后文还将详细讨论一些比较常见的问题。总之，确定问题的工作本身也是一项挑战。 3.1 计算机语言/图形学/游戏引擎知识 知识和经验无疑是一个开发者在优化项目性能时最宝贵的武器，不断地学习和更新也是每一个程序员武装起自己的过程。完善而饱满的知识自然不仅仅有利于确定问题，同样有助于解决问题。放在这里说是因为它是我们有能力着手优化工作的重要前提。 除了查看各类工具源码和文档、跟踪工具更新内容、翻阅大牛撰写的书籍、浏览各类技术论坛和博客等等以外，也可以在UWA的技术社区中找到很多优质内容。 UWA 学堂：持续更新各类优质课程，内容从某些开发工具的入门和使用到某个引擎模块的机制原理详解；从最新的移动端游戏技术实践到精品项目案例讲解等等。还邀请了众多具有多年从业经验的业界大佬和著名游戏公司合作伙伴撰稿，涵盖面广、质量颇高。更有每年侑虎科技UWA主办的UWA DAY游戏开发者大会的优秀内容。 UWA问答：帮助开发者找到更好的答案。是游戏开发者们日常沟通交流技术问题的良好平台。在这里你对游戏制作方方面面的任何问题，都能够得到讨论或解答。通过最直接的技术交流来少走弯路、获得经过实践检验的开发经验，让确定和解决问题的过程变得简单许多。 UWA开源库：帮助开发者发现更好的解决方案。不断更新和整合了各种来源的开源项目，翻译完毕、分类清晰、图文并茂，为开发者提供了更加方便地搜索发现和获取开源资源的渠道。 UWA Blog：包含UWA精选的各类技术文章、提醒学堂优质内容上新、整合问答优质问题、介绍UWA产品和其更新等各类UWA社区动向。 3.2 多种多样的辅助工具 工欲善其事必先利其器。使用工具获得直接精确的性能数据，能更加直观地反映出性能瓶颈，从而达到事半功倍…