UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 | 侑虎科技 - unity
type: channel
link: https://blog.uwa4d.com/tag/unity/
items: UWA DAY 2025 正式启动｜十年筑基，驱动游戏未来引擎
items: UWA DAY 2024议题汇总
items: UWA问答精选
items: Unity性能优化分析思路
items: Unity实时反射相关优化
items: Unity优化点概述
items: DLL混淆问题
items: Lua与C#传参
items: Unity性能优化 — 物理模块
items: iOS导出AssetBundle需要30个小时的解决办法

UWA DAY 2025 正式启动｜十年筑基，驱动游戏未来引擎
type: item
date: 2025-04-24T06:43:00+03:00
description: 由侑虎科技UWA主办的年度游戏开发者大会 - UWA DAY 2025，正式拉开帷幕！作为第八届盛会，也是侑虎科技成立十周年的里程碑之作，本届大会将以“十年筑基 · 驱动游戏未来引擎”为主题，于2025年8月在上海盛大举办。 从开发优化到质量保障，从前沿技术到实践落地，UWA DAY始终紧贴行业脉动，持续为开发者提供深度技术交流的平台。今年，我们将以更加开放的姿态，与广大开发者共同探讨下一阶段游戏工业的进化之路。 十年耕耘，与开发者共筑技术星河 自2015年创立以来，UWA始终坚持“快｜精准｜有温度｜值得信赖”的初心，持续深耕游戏研发工具和服务。十年来，从性能评测工具到全生命周期解决方案，从小型沙龙到全国技术峰会，我们始终与开发者并肩前行，见证并参与了中国游戏产业的不断跃迁。 UWA DAY，作为技术交流的风向标，也在这三千多个日夜中与千万开发者一起成长。站在十周年的新起点，我们愿以更加坚实的技术底座，为下一代引擎注入持续动力。 技术破界，重构未来研发生态 本届UWA DAY将围绕「引擎革新」、「工业化工具链」与「研发生态建设」三大核心主题，来自UWA及行业顶尖团队的资深技术专家，预计带来30+场高质量分享内容——从理论探索到实战落地，绘制一幅面向未来的技术图谱。 议题议程 2025年8月1日 周五 2025年8月2日 周六 议题总览 ➨十年筑基，驱动游戏未来引擎 主题演讲 张鑫 侑虎科技 CEO 随着移动游戏研发成本持续攀升与轻量化游戏生态的成熟，中国游戏行业正呈现 "品质深耕" 与 "敏捷开发" 并行的双轨发展格局。一端是3A化手游对工业化流程的极致打磨，另一端是轻量化团队对快速迭代效率的不懈追求。这种行业分化既考验着UWA技术服务的专业性与适配性，也为工具矩阵的场景化创新开辟了全新赛道。 过去一年，UWA围绕研发效率与玩家体验两大核心场景展开深度探索，在技术落地与产品迭代中实现关键突破。本次报告将重点分享三个方向的成果： GPM 2.0：玩家端体验的精准洞察。通过精准捕捉玩家的性能异常波动，为高品质游戏的长线运营提供质量保障。 GOT Online & Pipeline：工业化流程的 AI 赋能。通过与AI大模型的结合，进一步降低游戏团队对于研发工业化流程的准入门槛。 Gears：降低研发端性能检测的使用门槛。通过这一年来不断完善的检测功能，满足广大游戏团队的日常常规检测需求。 行业变革之下，UWA 始终相信，唯有扎根研发痛点的持续创新，才能在品质与效率的双螺旋中找到平衡点。本次报告将深度拆解技术落地的实战经验，期待与行业同仁共探 "工业化流程+智能化工具" 的破局路径，以十年积淀为基，为游戏未来研发注入新的动能。 ➨ UWA Gears深度体验 - 运行时性能测试与GPU深度分析新突破 张强 侑虎科技 CTO UWA Gears作为一款集成运行时性能分析与截帧渲染分析的专业测评工具，是游戏GPU性能优化的重要支撑，能够为开发者提供精准的性能数据与问题定位依据。 当前，随着游戏引擎对Vulkan API的支持日益成熟，以及移动设备的快速更新换代，Vulkan的兼容性持续改善，其在渲染效率提升、图形资源内存优化等方面的优势逐渐凸显，越来越多的研发团队开始使用Vulkan。在此背景下，UWA Gears近期实现了对Vulkan API截帧分析的支持，为开发者在Vulkan环境下的GPU性能优化提供了更强助力。 本次报告将围绕UWA Gears展开分享：一方面，详细演示如何借助该工具进行GPU性能分析；另一方面，重点展示在Vulkan环境下的重要参数解读与分析方法。通过这些内容，助力开发者更透彻地理解Vulkan特性，精准发现并高效解决GPU性能问题。 ➨ 虚幻引擎5构建开放世界下的优化、挑战以及开发方向 陈宝康 Epic Games 开发者关系工程师 现担任Epic Games开发者关系工程师，协助解决游戏公司在使用虚幻引擎中遇到的相关问题，曾先后就职于字节、腾讯，从事游戏开发多年。 随着引擎技术的不断发展，游戏引擎未来会更加关注开放世界的构建能力来带给玩家以沉浸式的体验，而Epic作为以赋能创作者和构建数字生态为核心的商业引擎，长远目标同样也是为了创建出一个元宇宙的虚拟世界，并带给玩家以身临其境的体验。每个人都可以自由的进行创作和表达，构建虚拟世界的未来，同时并将其技术赋能于游戏、影视、工业等不同领域。而在这长远目标下如何去构建开放世界成为了其中的重要一环，因为构建开放世界下的场景对游戏引擎提出了更高的要求，更大的开放世界意味着制作过程中需要面临一系列问题，本次报告与大家分享的就是虚幻引擎5针对开放世界在不同版本中主要做了哪些工作、目前的进度、面临了哪些挑战，以及未来的开发方向。主要包括：UE5构建开放世界的技术点、不同版…

UWA DAY 2024议题汇总
type: item
date: 2025-01-24T07:50:00+02:00
description: 自2017年首届「UWA DAY」举办以来，每一年的UWA DAY都如同与老友的相聚，大家齐聚一堂，共同探讨行业发展、切磋技术方案，携手进步，收获颇丰。 今年UWA DAY 2024以「创新潜藏无限可能」为主题，为大家带来了26场精彩纷呈的演讲，涵盖了App/小游戏开发、优化、质量保障及前沿技术等主题。同时，还有以“AI数字人”为主题的Unreal引擎工作坊，深入探讨行业前沿动态。 创新潜藏无限可能 主题演讲 https://edu.uwa4d.com/course-intro/1/567 近年来，随着移动游戏研发成本的显著上升和小游戏平台的逐步成熟，中国游戏行业正呈现出明显的两极化趋势。移动游戏团队不断追求高品质的研发，深入推进工业化研发流程；而小游戏团队则采用更高效、更灵活的方式来开发或移植游戏，力求迅速进入市场。这种变化为我们UWA带来了更高的要求，但同时也带来了新的挑战和机遇。 在过去的两年中，UWA在多个方面进行了深入探索。无论是工业化研发的进一步落地，还是小游戏的移植优化，我们都取得了显著的进展和突破。在这次报告中，我们将分享UWA在这两年中的主要工作和成果，重点包括： 工业化研发流程的持续创新 小游戏研发和优化方面的经验积累 玩家端性能分析工具的研发 在当前的游戏行业大环境下，我们相信，唯有持续创新和积极投入，才能找到破局之道。希望通过本次分享，能够为研发团队在移动游戏和小游戏的开发中带来更多的启示和推动力。 Gears — 运行时性能测试与GPU深度分析 https://edu.uwa4d.com/course-intro/1/568 UWA Gears 是侑虎科技近期发布的一款客户端无SDK性能分析工具，具有运行时性能测试与GPU深度分析两大分析模式。本次报告将对Gears进行基本的功能介绍与演示，并结合实际案例，详细讲解运行时需要关注的重要指标，分析App的性能瓶颈。以及通过Gears的截帧分析功能，排查渲染问题，分析渲染管线细节，定位GPU压力来源等。 也可参考本文介绍《UWA Gears正式上线，助力移动平台性能优化》 如何通过UWA GPM 2.0高效预警和定位玩家端的性能问题 https://edu.uwa4d.com/course-intro/1/569 近年来，随着大量新游戏的涌现，玩家对游戏品质和服务质量的要求日益提高。在众多同类产品中脱颖而出，成为各研发团队的首要任务。其中，性能体验是一个关键因素。那么，如何快速、精准地定位玩家端遇到的问题，成为了UWA近两年来的研究和解决重点。 此次报告将重点介绍我们在这一领域的进展，主要内容包括： 如何快速了解游戏项目上线后每个版本在玩家端的性能体验 如何快速掌握每个场景或局部玩法环节在玩家端的性能压力 如何高效定位每台设备的具体性能问题 我们希望通过UWA GPM2.0，研发团队不再需要等到玩家主动反馈时才发现问题，而是可以实时获悉版本、场景甚至单个玩家端的性能问题，并进行快速调整，从而进一步提升游戏质量和服务品质。希望此次分享能为研发团队在游戏性能优化方面提供有价值的参考和帮助。 也可参考本文介绍《如何高效预警和定位玩家端的性能问题｜UWA GPM 2.0 新品发布》 《忍者必须死》全球同服架构改造和上线前后经验分享 https://edu.uwa4d.com/course-intro/1/570 《忍者必须死》在海外上线的过程中，为了适配海外环境并达到全球同服的业务目标，我们面临一系列的技术选型以及对服务器架构的改造工作。本次报告首先介绍我们关于全球同服改造的背后思考和相关工作；然后介绍项目上线前的各类准备工作，包括压测、容灾测试、网络延迟优化和运维等。最后将介绍游戏上线后，为了降低云成本，项目组将DocumentDB改为对象存储的优化工作。 Unity移动游戏性能优化全解析与小游戏转化的实战经验 https://edu.uwa4d.com/course-intro/1/571 App和小游戏的性能优化是研发团队持续关注的热点，UWA在过往的报告中曾从各个维度讲解过关于性能优化的经验，那今年的报告又有何亮点？ 在本次报告中，我们总结了关于Unity移动游戏的优化案例以及由App转微信小游戏的经验分享，重点包括： 原理简单但易忽视的误区、老生常谈但仍高频出现的问题 稍作调整后性能表现就能明显提升的设置 针对来源不明的高内存占用拆解方式 排查项目发热原因等颇具挑战性的疑难杂症的排查思路 App转小游戏过程中的常见问题、性能采集工具的使用案例，以及URP项目的优化经验 用JetBrains Rider和TeamCity助力游戏开发的高效秘诀 https://edu.uwa4d.com/course-intro/1/572 你是否期待在游戏开发过程中获得更…

UWA问答精选
type: item
date: 2022-07-05T08:37:00+03:00
description: 1）Unity性能优化分析思路 ​2）资源打包关系依赖树 3）SpriteAtlas 中Include in Build的作用 4）使用Streaming Mipmap后纹理内存没有下降的疑问 5）URP Renderer Feature实现二次元描边，Cutout的处理问题 UWA每周推送的知识型栏目《厚积薄发 | 技术分享》已经伴随大家走过了330个工作周。精选了2022年上半年的精彩问答分享给大家，期待UWA问答继续有您的陪伴。 UWA 问答社区：answer.uwa4d.com UWA QQ群2：793972859（原群已满员） Unity Q：Unity有多少优化点？比如合批：静态合批、SRP合批、GPU实例化、UGUI Reruild、光照烘焙、反射探针、光照探针、Shader.Parse、Shader.CreateGPUProgram、场景加载优化和GC优化，还有哪些优化点？ A1：大方向上可以从CPU、内存、GPU这三个方向切入。 细分一下可以从CPU、内存、渲染、资源优化、耗电优化、网络优化、卡顿优化、优化工具的选择掌握这几个点入手。 一、CPU优化 缓存计算结果 预处理 限帧法 主次法 多线程 引擎模块（动画、物理、粒子、导航） 逻辑优化 二、内存优化 缓存法 内存池 资源管理器 控制GC 逻辑优化 Shader变体数量优化 三、渲染优化 SetPassCall渲染状态切换频次控制 DrawCall数量控制 带宽负载 显存占用 GPU计算量 四、卡顿优化 降帧法 摊帧法 限制数量法 逻辑优化 IO优化 使用进度条 五、资源优化 纹理优化 UI优化 字体优化 模型优化 场景优化 粒子优化 材质优化 指定标准美术规范 Shader变体数量优化 六、耗电优化 上面说到的优化点，或多或少都会影响到手机的耗电，也是优化耗电的措施，除此之外还有： 动态调整限帧 动态调整画质 七、网络优化 减少无用字段 降低字段精度 避免重复发送 网络异步化 压缩无效字节 压缩协议包 以上说的这些要点，大部分摘抄归纳自《移动游戏性能优化通用技法》。强烈建议多花些时间认真阅读一下这篇文章，然后以这篇文章作为指南，再去仔细研究里面提到的优化细节该如何展开。 感谢马三小伙儿@UWA问答社区提供了回答 A2：优化点肯定是无穷无尽的，这里搬运UWA的客户端性能优化思路，针对常见的引擎模块的相关问题都做了分析，讲的是比较全比较透的，常见的优化难题都罗列了。 《Unity性能优化 — 物理模块》 《Unity性能优化 — 动画模块》 《Unity性能优化系列 — 资源内存泄漏》 《Unity性能优化系列—Lua代码优化》 《粒子系统优化——如何优化你的技能特效》 《Unity性能优化系列—加载与资源管理》 《Unity性能优化系列—渲染模块》 《Unity性能优化 — UI模块》 《支持资源加载分析、场景分割》 《UWA报告使用小技巧，你get了吗？》 《UWA本地资源检测更新，助你严守项目性能的每个角落！》 感谢芭妮妮@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/61a0a56ed8413e18eb297ac3 AssetBundle Q：想做包体资源分析，大家有什么好的树显示工具或者思路推荐吗？有比较好的开源方案也可以。最简单就像N叉树一样，比如root一个文件名，然后展开整个树结构。 A1：我自己做了一个，供参考。都是用Unity自己的IMGUI最基本的接口去实现。 EditorWindows GUI.Box GUI.BeginGroup GUI.Label Handles.DrawBezier Handles.DrawWireDisc TreeView 基本上，组织好各个AssetBundle的依赖关系其实是很好呈现的。 感谢黄程@UWA问答社区提供了回答 A2：推荐一款比较好用的插件，不止有依赖树，还有其他打包的资源数据可供分析： https://assetstore.unity.com/packages/tools/utilities/build-report-tool-8162 感谢郑骁@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/623c8322a43e6117d040ae9b AssetBundle Q：SpriteAtlas中Include in Build的作用是什么？ A：专门做了一些测试，具体如下： 以下表达中Sprite对应的是Sprite类型的对象，Texture2D对应的是Texture2D的对象，这和Sprite对象是完全不同的东西，sactx表示生成的图集纹理。 测试情…

Unity性能优化分析思路
type: item
date: 2022-04-19T04:12:00+03:00
description: 1）Unity性能优化分析思路 ​2）Unity2020后Paticle子节点旋转并把ScalingMode设置为Hierarchy后，对根节点进行缩放时表现不正常 3）FBX默认会冗余lit.mat、lit.shader如何解决 4）部分手机（小米12）运行时不时闪退问题 这是第294篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题，建议阅读时间10分钟，认真读完必有收获。 UWA 问答社区：answer.uwa4d.com UWA QQ群2：793972859（原群已满员） Unity Q：Unity有多少优化点？比如合批：静态合批、SRP合批、GPU实例化、UGUI Reruild、光照烘焙、反射探针、光照探针、Shader.Parse、Shader.CreateGPUProgram、场景加载优化和GC优化，还有哪些优化点？ A1：大方向上可以从CPU、内存、GPU这三个方向切入。 细分一下可以从CPU、内存、渲染、资源优化、耗电优化、网络优化、卡顿优化、优化工具的选择掌握这几个点入手。 一、CPU优化 缓存计算结果 预处理 限帧法 主次法 多线程 引擎模块（动画、物理、粒子、导航） 逻辑优化 二、内存优化 缓存法 内存池 资源管理器 控制GC 逻辑优化 Shader变体数量优化 三、渲染优化 SetPassCall渲染状态切换频次控制 DrawCall数量控制 带宽负载 显存占用 GPU计算量 四、卡顿优化 降帧法 摊帧法 限制数量法 逻辑优化 IO优化 使用进度条 五、资源优化 纹理优化 UI优化 字体优化 模型优化 场景优化 粒子优化 材质优化 指定标准美术规范 Shader变体数量优化 六、耗电优化 上面说到的优化点，或多或少都会影响到手机的耗电，也是优化耗电的措施，除此之外还有： 动态调整限帧 动态调整画质 七、网络优化 减少无用字段 降低字段精度 避免重复发送 网络异步化 压缩无效字节 压缩协议包 以上说的这些要点，大部分摘抄归纳自《移动游戏性能优化通用技法》。强烈建议多花些时间认真阅读一下这篇文章，然后以这篇文章作为指南，再去仔细研究里面提到的优化细节该如何展开。 感谢马三小伙儿@UWA问答社区提供了回答 A2：优化点肯定是无穷无尽的，这里搬运UWA的客户端性能优化思路，针对常见的引擎模块的相关问题都做了分析，讲的是比较全比较透的，常见的优化难题都罗列了。 《Unity性能优化 — 物理模块》 《Unity性能优化 — 动画模块》 《Unity性能优化系列 — 资源内存泄漏》 《Unity性能优化系列—Lua代码优化》 《粒子系统优化——如何优化你的技能特效》 《Unity性能优化系列—加载与资源管理》 《Unity性能优化系列—渲染模块》 《Unity性能优化 — UI模块》 《支持资源加载分析、场景分割》 《UWA报告使用小技巧，你get了吗？》 《UWA本地资源检测更新，助你严守项目性能的每个角落！》 感谢芭妮妮@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/61a0a56ed8413e18eb297ac3 ParticleSystem Q：Unity 2020后Paticle子节点旋转并把ScalingMode设置为Hierarchy后，对根节点进行缩放时表现不正常。 在2019及其之前的版本没有这个问题。升级到2020后出现。 子节点的旋转会改变对应的缩放轴，如果x轴旋转了-90度，那么根节点缩放y轴就等于缩放了z轴。 具体见下图： A：已找到对应官方答复： 《particle-system-behavior-changes-when-it-is-rotated-or-scaled-in-negative-axis》 2018.3b版本后不建议对Billboard节点使用旋转和非统一缩放。 感谢jiacat@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/6246ad4fa43e6117d04e7f0a Material Q：打AssetBundle包发现会包含lit.mat、lit.shader，原因是FBX默认自带的，有尝试下面方法： **1. 代码设置 renderer.sharedMaterials = new Material[] ，但是下次再打开Unity或Reimport，又变回lit。** 2. 监听文件变化，发现是FBX的同上操作，但是这个在打AssetBundle包时又报一些莫名其妙的错误。 请问大家都是怎么处理的？ A1：两种方式解决这个问题： 一种是美术在出资源时直接不导出材质资源。 一种是自己在Unit…

Unity实时反射相关优化
type: item
date: 2022-02-09T04:35:00+02:00
description: 一．优化最终效果及消耗 8人同屏，最高画质，耗时1.1ms（高通 骁龙710）。因为项目未上线原因，只能用测试图进行相关说明。 二、原反射脚本源码 1. 源码 using UnityEngine; using System.Collections; [ExecuteInEditMode] public class MirrorReflection : MonoBehaviour { public Material m_matCopyDepth; public bool m_DisablePixelLights = true; public int m_TextureSize = 256; public float m_ClipPlaneOffset = 0.07f; public LayerMask m_ReflectLayers = -1; private Hashtable m_ReflectionCameras = new Hashtable(); // Camera -> Camera table public RenderTexture m_ReflectionTexture = null; public RenderTexture m_ReflectionDepthTexture = null; private int m_OldReflectionTextureSize = 0; private static bool s_InsideRendering = false; public void OnWillRenderObject() { if (!enabled || !GetComponent<Renderer>() || !GetComponent<Renderer>().sharedMaterial || !GetComponent<Renderer>().enabled) return; Camera cam = Camera.current; if (!cam) return; // Safeguard from recursive reflections. if (s_InsideRendering) return; s_InsideRendering = true; Camera reflectionCamera; CreateMirrorObjects(cam, out reflectionCamera); // find out the reflection plane: position and normal in world space Vector3 pos = transform.position; Vector3 normal = transform.up; // Optionally disable pixel lights for reflection int oldPixelLightCount = QualitySettings.pixelLightCount; if (m_DisablePixelLights) QualitySettings.pixelLightCount = 0; UpdateCameraModes(cam, reflectionCamera); // Render reflection // Reflect camera around reflection plane float d = -Vector3.Dot(normal, pos) - m_ClipPlaneOffset; Vector4 reflectionPlane = new Vector4(normal.x, normal.y, normal.z, d); Matrix4x4 reflection = Matrix4x4.zero; CalculateReflectionMatrix(ref reflection, reflectionPlane); Vector3 oldpos = cam.transform.position; Vector3 newpos = reflection.MultiplyPoint(oldpos); reflectionCamera.worldToCameraMatrix = cam.worldToCameraMatrix * reflection; // Setup oblique projection matrix so that near plane is our reflection // plane. This way we clip everything below/above it for free. Vector4 clipPlane =…

Unity优化点概述
type: item
date: 2021-12-01T06:33:00+02:00
description: 1）Unity优化点概述 ​2）Unity Assets下的Shader加载到内存需要满足什么样的条件 3）URP内置Shader生成的变体太多问题 4）常见的Unity地形编辑插件 这是第277篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题，建议阅读时间10分钟，认真读完必有收获。 UWA 问答社区：answer.uwa4d.com UWA QQ群2：793972859（原群已满员） Unity Q：Unity有多少优化点？ A：大方向上可以从CPU、内存和GPU这三个方向切入。细分一下可以从CPU、内存、渲染、资源优化、耗电优化、网络优化、卡顿优化和优化工具的选择掌握这几个点入手： 一、CPU优化 缓存计算结果 预处理 限帧法 主次法 多线程 引擎模块（动画、物理、粒子、导航） 逻辑优化 二、内存优化 缓存法 内存池 资源管理器 控制GC 逻辑优化 Shader变体数量优化 三、渲染优化 SetPassCall渲染状态切换频次控制 DrawCall数量控制 带宽负载 显存占用 GPU计算量 四、卡顿优化 降帧法 摊帧法 限制数量法 逻辑优化 IO优化 使用进度条 五、资源优化 纹理优化 UI优化 字体优化 模型优化 场景优化 粒子优化 材质优化 指定标准美术规范 Shader变体数量优化 六、耗电优化 上面说到的优化点，或多或少都会影响到手机的耗电，也是优化耗电的措施，除此之外还有： 动态调整限帧 动态调整画质 七、网络优化 减少无用字段 降低字段精度 避免重复发送 网络异步化 压缩无效字节 压缩协议包 以上说的这些要点，大部分摘抄归纳自《移动游戏性能优化通用技法》。 强烈建议多花些时间认真阅读一下这篇文章，然后以这篇文章作为指南，再去仔细研究里面提到的优化细节该如何展开。 感谢马三小伙儿@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/61a0a56ed8413e18eb297ac3 Shader Q：只要在Assets中的Shader，是不是只要开始运行就会直接加进内存？ A：在Unity工程里面，Assets目录下的资源要进内存，要经历这么几个步骤： 首先是要这个资源被打包进包体里面，有这么几种情况进入包体： 这个资源在Resources目录下，无论是否被引用到； 这个资源直接被场景引用，比如场景中的一个材质球使用了Shader A，这个场景最终进包体了。场景进入包体，有两种情况：一种是这个场景是被加入BuildSettings里面了，另外一种情况是被打包AssetBundle了。被场景引用，还有另外一种情况，就是被场景中的脚本引用了； 资源被主动或者被动进AssetBundle了； 这个资源被Unity某些设置项引用了，最终打包的时候这个资源也会进包体，比如游戏启动时候的Flash纹理，或者大家比较熟悉的Always Included Shaders设置项。 上面说的4种情况应该是一个资源进包体的所有情况了。 资源进包体后，和进入内存是两回事，要进内存还需要被加载进内存。加载进内存的方式会因为前面4种进包体的方式相对应，各不相同： 需要调用Resources.Load进行加载； 需要调用SceneManager.Load进行场景加载，如果是场景打包进入AssetBundle中，那么需要先加载这个场景的AssetBundle，再SceneManager.Load加载场景； 直接AB.LoadFrom加载AssetBundle，再AB.LoadAsset加载资源； 通常在设置项设置的资源，Unity引擎会自动进行加载内存的管理，不同的设置项，时机不同。 感谢小ben@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/619cce5ed8413e18eb241eb5 Shader Q：打包时URP的Shader变体竟然有2w个，我有什么办法优化下吗？有什么办法可以查看用了哪些内置Shader的变体吗？ A1：变体一般分为multi_compile和shader_feature。multi_compile会把所有可能变体的可能性都生成一遍，shader_feature在Build的时候只会打包用到的Keyword。 建议替换成shader_feature，但是有一些代码启动的Keyword在Build的时候Unity不知道，需要手动加入Shader Variant Collection中。 UWA有一个本地资源检测工具可以看，然后内置的Shader可以去Unity官网上下载到本地，然后再进行修改。 感谢萧小俊@UWA问答社区提供了回答 A2：当然减Feat…

DLL混淆问题
type: item
date: 2021-11-24T07:17:00+02:00
description: 1）DLL混淆问题 ​2）Unity主程如何做项目管理 3）将ASTC格式转换为png格式 4）iOS 14在iPhone正常，但在iPad上会卡住 这是第276篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题，建议阅读时间10分钟，认真读完必有收获。 UWA 问答社区：answer.uwa4d.com UWA QQ群2：793972859（原群已满员） Scripting Q：如果不用收费软件和加固，我们自己使用免费软件，如何对DLL进行混淆。 注：之前是用Microsoft.NET/Framework64/v3.5/csc进行打DLL，但是今天我回顾一下发现，DLL并没有混淆。 A1：若在Unity上使用，可以参考开源的方案：Unity Obfuscator Demo 简介 这是一款基于Mono.Cecil库，对C#编译后程序集进行IL代码注入实现的轻量Unity混淆插件，混淆发生在编译后，开发过程无需关心。此插件已在带Lua热更方案的商业MMO手游项目上验证过可行性。 主要功能 对命名空间、类、属性和字段的命名混淆 插入垃圾代码 在原代码中插入对垃圾代码的调用 特色功能 命名混淆支持随机字符串或从词库抽取名字 支持随机种子，可实现重复Build后混淆结果一致 支持黑白名单，排除部分在混淆后不能正常工作的代码，确保项目正常运行 混淆后输出混淆前后的名字对应关系文件 支持多DLL 感谢马三小伙儿@UWA问答社区提供了回答 A2：可以看一下AssetStore上的插件，我之前有个项目也用过： https://assetstore.unity.com/packages/tools/utilities/obfuscator-free-89420 免费版基本上可用： https://assetstore.unity.com/packages/tools/utilities/obfuscator-48919 收费版支持IL2CPP，支持程序集定义文件。 感谢萧小俊@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/61922be9d8413e18eb14a43f Unity Q：Unity主程如何做项目管理？比如资源管理、代码管理和工程管理。可以从多个维度讨论下吗？ A1：资源还是比较简单的，首先按照功能或者需求进行文件夹分类，资源的格式可以写一些AssetPostprocessor的代码来强制转换，整个工程的资源管理自动化。 开发的人员比较多，又对代码质量有一定要求，可以考虑用Git，不要用SVN，主程负责Review所有PR的代码，然后定期进行UT和BVT。 工程管理也可以依赖于Git的Tag和Branch来管理，尽量保证每个版本都是ZBB。 主程要做的事情还是蛮多的，简单写了一下，欢迎大家来讨论。 感谢萧小俊@UWA问答社区提供了回答 A2：身为一个合格的主程，我觉得应该具备以下素质： 1.首先是技术方面，就当独当一面，一马当先。 强大的技术支撑是要具备的，这里其实也可以细分，一个是专业性和广度。先提升某一方面的专业度，同时了解学习新技术，在不同领域的知识要有相对的了解。 2.再之就是管理方面，抓主线，控支流。 应该有好的项目框架。框架是为了更好的迭代和规范项目。一切都是为了开发跟成品服务的。所以不管代码规范，资源管理，甚至是使用习惯，都要遵循简单易用，通俗易懂为原则。比如开发了一个工具，功能非常强大，但是没人会使用它。那意义就大打折扣了。 技术上没有捷径，全靠努力跟积累。管理上需要自己思维上变通，多做尝试。但是有一点我觉得要注意，不能什么都面面俱到，主程是要把控大方向的，不能什么都要干预，适当放手，要培养人，不是带人。这样团队才有创新力，团队成员才会有成就感。而不是个人成就。管理是门大学问，不像技术可以有固定的学习思路。需要自己不断探索，才会有自己的风格和魅力。 感谢廖武兴@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/61947fe3d8413e18eb17e003 Texture Q：.astc类文件如何转换为.png文件，Windows操作系统。 A：ARM提供了压缩ASTC和解压的工具。 对应命令： 压缩：astcenc-sse2.exe -cl origin.png example.astc 6x6 -medium 解压：astcenc-sse2.exe -dh example.astc example.png 可以参考：https://github.com/ARM-software/astc-encoder 感谢范世青@UWA问答社区提供了回答，欢…

Lua与C#传参
type: item
date: 2021-07-13T12:27:00+03:00
description: 1）Lua与C#传参 ​2）Unity发布iOS版本出现屏幕问题 3）安卓的View成为Unity界面的一部分 4）Unity升级导致项目启动时间过长 5）Unity中Cascaded Shadows在移动端的设置 这是第258篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题，建议阅读时间10分钟，认真读完必有收获。 UWA 问答社区：answer.uwa4d.com UWA QQ群2：793972859（原群已满员） Lua Q：游戏中是先在Lua中String.format好再传入C#，还是在Lua里把参数传入C#，在C#里用String.format好？ 即一个是Lua加载文字表，String.format后传给C#显示，另一个是C#读表，Lua把参数传给C#，再string.format使用，哪个方式更好些，或者有没有其他更好的方式？ A1：搬运群里大佬的问答：第二种比较好，因为传参越简单越好，参数可以打包传。 感谢Tao@UWA问答社区提供了回答 A2：可以参考一下这篇文章：《用好Lua+Unity，让性能飞起来——Lua与C#交互篇》，总之Lua与C#传参，优先考虑int、float和double等类型，其次bool、string及object等类型，同时尽可能降低交互次数。 感谢羽飞@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/60e41d96e58b4719dd3e2916 iOS Q：Unity发布iOS版本在iOS 11之后出现屏幕显示问题：半屏被压缩，另一半黑屏。 A：直接在编辑器中设置这几个参数，不要在代码中设置这个，7p就不会出现这个问题： Screen.autorotateToLandscapeLeft = true; Screen.autorotateToLandscapeRight = true; Screen.autorotateToPortrait = false; Screen.autorotateToPortraitUpsideDown = false; Screen.orientation = ScreenOrientation.AutoRotation; 感谢许家胜@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/5ab9ef650b827e2c0bfdd1b6 Unity Q：加载了一个安卓的Activity，会遮挡住Unity的界面，如何让安卓的View，成为Unity界面的一部分呢？Unity界面的一部分使用安卓原生SDK的界面实现。 A：安卓混合Unity的界面，已经完成了。 https://blog.csdn.net/Yzw_92_4_11/article/details/68952529 感谢题主韩飞@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/60e6caa7e58b4719dd3e296b Editor Q：查看了Unity的editor.log发现里面： RefreshInfo: InitialScriptRefreshV2(NoUpdateAssetOptions) RefreshProfiler: Total: 0.000ms InvokeBeforeRefreshCallbacks: 1115393.587ms ...... OnSourceAssetsModified: 340.325ms ...... ImportAndPostprocessOutOfDateAssets: 1032441.185ms (82533.117ms without children) ImportManagerImport: 82501.381ms (0.000ms without children) ...... 有没有大佬知道这个是在处理什么东西？科学上网了也没有查到相关信息，这里看耗时就很长时间了1115393.587ms。 A：参考以下几点： 检查一下项目是不是放在机械硬盘上，建议放NVME的固态上。因为高版本的数据结构更复杂了，不用固态来不及序列化。 检查一下是不是开了PlasticSCM。 感谢萧小俊@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/60e2afece58b4719dd3e28ed Rendering Q：Unity的Shadow Cascade功能在移动平台中是否生效？ 在场景使用了Unity自带的实时阴影，具体参数如下： 用Frame…

Unity性能优化 — 物理模块
type: item
date: 2021-07-05T05:12:00+03:00
description: 我们曾在四年前对于Unity的主流模块的性能优化知识点逐一做过讲解，俗称“小白版”。随着这几年引擎本身、硬件设备、制作标准等等的升级，UWA也不断更新优化规则和方法并持续输出给广大开发者。作为"升级版"的性能优化手册，【Unity性能优化系列】将力图以浅显易懂的表达，让更多开发者可以受用。本期我们来继续分享物理模块相关的知识点。 在Unity自带的物理引擎中，物理模块的耗时主要来自FixedUpdate.PhysicsFixedUpdate和逻辑代码中的射线检测、碰撞检测等。FixedUpdate.PhysicsFixedUpdate函数的耗时构成主要有两部分：一个是Physics.Processing，一个是Physics.Simulate。一般来说，我们要关注这两个函数的堆栈，通过堆栈函数的调用次数、耗时占比来进一步定位原因。常见的影响性能的因素和优化对策有这些： 一、项目是否确实需要物理模块 首先，我们需了解Unity上Auto Simulation选项的开关机制。在Unity 2017.4以前无该选项，引擎会根据项目是否存在物理内容自动开启或关闭；在Unity 2017.4及以后该选项开放，默认为开启状态。 很多项目往往没有关注到物理模块开关与否，造成不必要的性能浪费。建议研发团队根据项目情况考虑是否开启物理模块，亦可考虑通过其它方案替代物理模块作用，以节省物理部分的耗时。 二、控制物理调用次数 在UWA的真人真机测评报告的物理模块中，我们可以看到物理更新次数的统计。 物理调用次数需着重关注以下两个参数： 1）Fixed Timestep 其决定了FixedUpdate的更新间隔，该值越大，每帧物理更新调用次数越少。但物理更新频率过低可能会造成部分机制异常，建议团队在可接受范围内尽量调高Fixed Timestep数值。 2）Maximum Allowed Timestep 这里我们需要先知道物理系统本身的特性，即当游戏上一帧卡顿时，Unity会在当前帧非常靠前的阶段连续调用N次FixedUpdate.PhysicsFixedUpdate，Maximum Allowed Timestep的意义就在于限制物理更新的次数。 Maximum Allowed TimeStep决定了单帧物理最大调用次数，该值越小，单帧物理最大调用次数越少。在Fixed Timestep为20ms的前提下，将Maximum Allowed Timestep从333ms下调为100ms，那么无论卡顿情况如何，该帧最多只会调用5次，而不是最多17次。 另外建议大家先优化其他模块，这样可以减少下一帧的物理更新次数。 三、Contact数量是否合理 Contact数量异常通常有以下两种情况： 1）Contact数量过多 需考虑是否存在不必要的物理碰撞检测，例如盾牌与地面的碰撞。 2）Contact数量为0且存在物理耗时 Contact数量为0代表项目中没有碰撞或者Trigger，在不使用布料模拟等其他物理特性的情况下，可以考虑将物理模块关闭，即关闭AutoSimulation。 四、减少Raycast使用 Raycast，也就是我们常说的射线检测，其耗时与射线数量成正比。要控制Raycast的耗时，最简单的办法就是控制射线数量。 但部分项目确实需要较多的Raycast，例如弹幕游戏中Raycast数量往往较多，这种情况下可以通过Job System下的RaycastCommand将Raycast的耗时从主线程转移到子线程上，进而减少其耗时。 五、Auto Sync Transforms 勾选Auto Sync Transforms后，发生Physics Query时，Unity会将Rigidbody/Collider的Tranform变化同步到物理引擎，如Position，Scale等。另外勾选AutoSimulation时，Unity会在每次物理更新的时候自动同步一次Rigidbody和Collider，所以当关闭AutoSimulation后，如果项目中使用了射线检测或者NGUI，通常需要Auto Sync Transforms进行勾选，否则会发生射线检测结果不准确或者UI事件不响应的情况。 同步操作在一般情况下的性能开销很低，通常只在超大场景，且有大量物体均加载到场景中，才会出现较高的耗时问题。 六、逻辑代码相关 这里的逻辑代码指的是MonoBehavior脚本中的void FixedUpdate函数，在Profiler中通常会显示为xxx.FixedUpdate，此函数的调用次数会受到物理更新次数的影响。 比如场景中有10个挂载了Monster.cs的小怪，且该脚本在void FixedUpdate中写了逻辑代码。那么在当前帧物理更新次数为3时，…

iOS导出AssetBundle需要30个小时的解决办法
type: item
date: 2021-06-30T05:59:00+03:00
description: 1）iOS导出AssetBundle需要30个小时的解决办法 ​2）Unity主程如何构建知识树 3）TMP中设置CullTransparent不能使Alpha为0的Text被Culling 4）Spine动画贴图在线性空间中出现黑边线 5）Spine数量太多导致Update性能损耗很大 这是第256篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题，建议阅读时间10分钟，认真读完必有收获。 UWA 问答社区：answer.uwa4d.com UWA QQ群2：793972859（原群已满员） AssetBundle Q：现在游戏资源大概870MB（Android平台导出的所有AssetBundle），在Windows（i5-7500 CPU@3.40GHz，GTX1050，16GB内存，SSD硬盘）下导出全量的Android资源耗时大概是2小时，i9机器上1小时，6年前的i3差不多4小时。 在导出代码相同的情况下，在Mac Mini（2018，i5@3GHz，Intel630，16GB DDR4内存，SSD硬盘）大概花了38小时，换了Macbook Pro（2018，i9@2.9GHz，Redeon560X 4G，16GB DDR4内存，SSD硬盘），也要30小时，不知道问题出在哪里，请教各位大神，有没有遇到过类似问题？也怀疑是PVRTC的问题，把所有资源重新导成了ASTC也没改善。 A：看看是不是这个问题： https://forum.unity.com/threads/case-1192489-building-asset-bundles-decompresses-textures.742757/ 简单来说就是加个-nographics参数打包。 经过题主测试：最终生成在Mac Pro i9上面，40分钟不到。 感谢小埃拉@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/60d3ee2de58b4719dd3e26cd Unity Q：如果以MMORPG游戏为准，Unity主程需要构建什么样的知识树？ A1：这个问题很难回答，也不敢回答。外面好多大神，除了国内的，还有国外的。主程序除了知识体系，还有管理体系、方案分析、人员成本控制、运营和产品的把控体系。单从知识树上说，推荐Milo Yip的知识树+御三家（Unreal，Unity和寒霜）任意一款引擎源码的完整阅读：https://cloud.tencent.com/developer/article/1005446。 感谢马古斯@UWA问答社区提供了回答 A2：这个问题很宽泛，是一个很大的问题，即便把范围缩小到MMORPG的范围也包含了很多东西。其实楼上马古斯回答得已经很好了，Milo的那个图谱基本涵盖了核心技术的内容。论管理，UWA学堂有篇浅显的文章，讲我之前创业的时候做的一些管理工作，有兴趣可以看看《创业团队的技术管理》。 简单分享一些我认为一个MMORPG游戏主程应该掌握的技术的内容： 1. 编程语言 这个很容易理解，是程序的基础。 常用的静态语言：C++、C#、Go 常用的动态语言：Lua、Python 然后因为通常游戏开发需要多种语言配合，所以还需要混合编程的概念和技巧。 这其中每种语言的语法和特性需要了解之外，一般会涉及到内存管理。 2. 编程规范 同样无需多言，作为主程，需要制定团队的编程规范，并且需要借助LuaCheck等静态检查等工具让规范可以更好地执行和保证。 3. 编程范式 这块我认为包含两大部分：一块是搭建整个GamePlay框架的框架方式，传统Entity继承、组件化、ECS是三种比较常规的；还有一块就是设计模式以及它们的应用。 4. 数据结构与算法，以及三维数学 默认是3D游戏，这块的基础知识还是需要的。 5. 游戏引擎 要有自己熟悉和掌握的游戏引擎，包括客户端与服务端。 6. GamePlay基础 除了前面提到的编程范式之外，GamePlay还有很多内容： 3C 游戏状态管理 常规的技能结构等等 7. 物理系统 如何设计碰撞检测、玩家控制、车辆系统、布娃娃、柔体效果。 8. 动画系统 骨骼动画原理、蒙皮的基本概念、动作融合、Rootmotion、动画重定向、角色模型和动作制作规范等等。 9. 特效系统 10. 渲染 了解基本的渲染管线 熟悉PBR 了解非真实渲染 各种后处理效果 11. 音频技术 FMOD、Wwise、引擎自带音频功能的使用 材质音效区分、P1/P3区分 混音回响等功能支持 12. 大世界场景制作和管理流程 如果是MMORPG，很可能需要大世界制作的技术，基于World Mashine、Houdini等PCG的生产管线如何建立，…