UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 | 侑虎科技 - Unreal
type: channel
link: https://blog.uwa4d.com/tag/Unreal/
items: Unreal LLM 内存：从底层透视“消失的内存”
items: 不用死磕 Insights，也能定位UE性能瓶颈
items: UWA DAY 2025 正式启动｜十年筑基，驱动游戏未来引擎
items: PlayerSettings.WebGL.emscriptenArgs设置无效的问题
items: Unity升级后打包AssetBundle变慢
items: GOT Online for Unreal 功能更新
items: URP关于多个摄相机的性能优化
items: Linear Rendering在移动设备上的支持率
items: UWA正式支持Unreal 引擎！
items: 基于Unreal引擎的大地形加载研究

Unreal LLM 内存：从底层透视“消失的内存”
type: item
date: 2026-06-03T05:44:00+03:00
description: 在当前的移动游戏市场，开放世界、高写实画质已成为头部产品的标配。随之而来的是虚幻引擎在资源管理上的巨大压力，而中端机型（尤其为iOS平台）通常只有4-6GB的可用内存，引擎层、渲染层、逻辑层以及复杂的资源堆积，使得OOM（Out of Memory）成为了悬在开发者头上的达摩克利斯之剑。 传统的性能分析手段往往面临“数据孤岛”并存在明显短板：Stat Memory过于宏观、颗粒度粗；MemReport生成慢、输出量大，无法捕捉瞬时内存尖峰；驱动层显存分配更是完全黑盒。 今天，UWA正式发布内存分析功能升级，从引擎层到驱动层，打造了一套覆盖LLM内存明细、RHI显存穿透与Vulkan驱动层盲区的全链路分析方案，让内存优化从“盲猜”变成“可量化、可定位、可落地”的确定性工作。 —— 从此，没有“看不见的内存”。 1. LLM（Low Level Memory Tracker） 可视化赋能 虚幻引擎在4.18之后引入了LLM，这本是一个极强的底层追踪工具，但由于其原始输出是枯燥的统计数值，大部分团队仅将其用于基础的模块占比查看。我们对LLM数据进行了深度可视化封装，让开发者告别“对着日志大海捞针”的低效优化： 在UWA报告的系统层面，通过PSS/进程内存曲线实时监控整机内存、Swap与显存占用，直观捕捉内存泄漏、瞬时尖峰与系统内存吃紧风险，快速判断项目整体内存健康度。 报告既展示总内存变化趋势，也拆分出已追踪、未追踪内存明细，同时按平台、图形、堆内存等模块拆解占⽐，定位“⿊盒内存”与资源级占⽤问题。 在LLM内存细分模块中，我们将STAT_AsyncLoadingLLM、STAT_EnginePreInitLLM、STAT_UILLM等核心模块的内存数据，转化为直观的趋势曲线，完整记录整个运行周期内的内存峰值、变化节点与场景对应关系，一眼识别内存泄漏与瞬时尖峰。 2. Vulkan驱动层盲区破解 在Android平台上，Vulkan驱动层的内存分配策略，是性能不稳定的重要根源。UWA针对Vulkan进行了专项优化，能够精准捕捉VkDeviceMemory的分配行为。 同时，UWA深入RHI底层接口，对于定位“纹理残留”尤为关键。很多时候CPU侧对象已释放，但因资源引用链未断、RHI延迟释放或驱动层缓存机制，显存并未真正回收。UWA能够通过这种双端对比，直接指出那些“逻辑上已释放但物理上仍占位”的资源泄露点。 报告罗列详细的RHI资源，RenderTargetPool中的对象及其具体属性，清楚了解显存的占用情况。 3. 从宏观到微观 构建UE内存优化的“确定性闭环” 本次升级的三大模块并非孤立存在，而是形成了一套完整的优化闭环： 先通过LLM模块趋势，快速锁定内存大户与异常波动节点； 再通过Vulkan驱动层分析，解决平台特有的盲区与碎片问题。 最后通过RHI显存下钻，定位显存泄漏与冗余资源。 从宏观内存大盘到微观资源明细，从引擎层到驱动层，UWA打破传统工具的数据壁垒，把过去靠经验、靠运气的内存优化，变成可量化、可定位、可落地的确定性工作。 我们深知：性能优化不应是上线前的“救火”，而应是研发全周期的“防火”。让每一分内存都花在刀刃上，让每一次上线都充满底气。 关于UWA UWA是一家创业十年的高新技术企业，作为游戏行业的深耕者，UWA始终专注于为使用Unity、Unreal引擎的开发者提供丰富的优化产品，帮助开发者高效解决开发问题、定位性能瓶颈、提供解决方案，已支持超过一万款游戏项目。还打造了技术博客、问答、开源库、学堂等社区产品，为开发者提供便利和高效的支持。线上培训和线下教育的新业务， 满足行业对人才培育的需求。

不用死磕 Insights，也能定位UE性能瓶颈
type: item
date: 2026-04-03T06:00:00+03:00
description: 做UE项目的你，一定经历过这些场景：QA测出卡顿 → 录屏反馈 → 程序复现半天，对不上。打开 Unreal Insights，却发现真机数据和Editor分析结果不一致： 跨线程（GameThread / RenderThread / RHIThread）互相影响，瓶颈像“黑盒”一样难以拆解，长周期卡顿、内存泄露问题，测得到却抓不住。最后问题不是解决不了，而是——定位成本太高，效率太低。 UE性能分析长期存在一个核心断层：开发侧分析工具（Insights）与日常QA测试数据之间，无法稳定对齐，这意味着：QA的数据，程序不能直接拿来主义、分析必须反复复现、性能优化高度依赖经验与人力，仍然是一件“专家工具 + 人肉分析”的事情。 随着 Unreal Engine 5.7的发布，UWA GOT Online UE版迎来全量升级。但这次，我们做的不是简单适配，我们想做的是：把UE性能优化，从“少数人能做”，变成“团队都能做”的标准能力。 原生级引擎适配 让数据第一次真正“对齐” 从“看数据”到“直接定位问题” 我们完成了UE 5.x全系列（含5.7）的原生适配，并打通了引擎底层数据链路。具体包括： 1. 函数级Timeline与Insights的100%对齐 函数名、调用层级、时间统计完全一致，这意味着：真机数据，可以直接用于定位问题，而不是“参考数据”，程序无需再在多个工具之间反复核对。 2. 引擎原生指标全量接入 新增5大类、数十条UE原生STAT指标，譬如覆盖了渲染流程中，从FDrawSceneCommand（RT）到RHIThreadExecute（RHI），每一层都有指标 + 函数堆栈，可以精确定位：到底卡在“哪一段渲染流程”。 另有，加载/GC/动画/物理/AI/UI，所有数据均来自UE原生采集通道，开发者看到的，就是引擎真实发生的。 物理模块 UI 模块 多线程核心指标（Game/Render/RHI）全面覆盖：支持多视角切换（总览/单帧/场景） 且支持独立线程分析、冰柱图 + 堆栈联动、万级节点自动过滤。可以直接定位到某一帧、某一线程、某一个函数。 性能优化第一次变成“团队能力” 这个版本中我们也支持了一系列对于日常调试需求来说非常友好的功能，譬如： 新增Direct Mode模式，支持游戏启动后，立即开始抓取性能数据。能够针对游戏启动后加载慢、内存增长快等特殊场景进行针对排查。 编译级开关可控，支持宏定义一键屏蔽 SDK，可在 Debug、Release 等不同编译环境中灵活控制 SDK 的启用与关闭，彻底避免了 SDK 对项目正常开发、编译与发布的影响。 集成流程简化，移除 Binaries 目录，降低了项目版本管理与团队协作的成本。 这次升级里，最具行业意义的一点，QA可以参与性能定位了： 过去：QA → 发现问题 → 程序分析 → 来回拉扯 现在：QA → 直接提供可定位数据 → 程序直接修 带来的本质变化是：性能优化，从“程序能力”，变成“团队协作能力”，并且覆盖研发全周期的性能管控，从SDK接入、功能测试、性能回归、长周期监控、一套工具全部覆盖，支持 Android / iOS；不只是“跑得快”，也关注“玩家体验”。 从2015年至今，UWA始终专注于性能优化领域。但这一次，我们更在意的是另一件事：能不能把“复杂能力”，变成“标准流程”，如果你正在做UE项目，并且遇到这些问题： 性能问题定位效率低 QA与程序反复沟通 长周期问题难复现 那这次Unreal版的GOT Online，就是为你准备的。我们做的，不只是工具升级，而是让性能优化这件事，第一次可以被“团队稳定复用”。 关于UWA UWA是一家创业十年的高新技术企业，作为游戏行业的深耕者，UWA始终专注于为使用Unity、Unreal引擎的开发者提供丰富的优化产品，帮助开发者高效解决开发问题、定位性能瓶颈、提供解决方案，已支持超过一万款游戏项目。

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构建开放世界的技术点、不同版…

PlayerSettings.WebGL.emscriptenArgs设置无效的问题
type: item
date: 2024-04-23T05:49:00+03:00
description: 1）PlayerSettings.WebGL.emscriptenArgs设置无效的问题 2）java.lang.NoSuchMethodError的不明崩溃问题 3）UE电影摄像机旋转问题 4）Android设备游戏切后台后唤起，有概率变卡且黑屏 这是第383篇UWA技术知识分享的推送，精选了UWA社区的热门话题，涵盖了UWA问答、社区帖子等技术知识点，助力大家更全面地掌握和学习。 UWA社区主页：community.uwa4d.com UWA QQ群：465082844 WebGL Q：游戏里用了C++的第三方库集成到xLua里面，端版是用CMake构建，可以配置宏、Include路径等，很方便。 我现在用Unity 2021.3发布的WebGL版本，xLua是把所有Lua代码放在了“工程目录/WebGLPlugins”下面，在引擎里去#include这里的C代码，也没问题。 但是自己的C/C++代码比较多，也不能全部扔在同一个目录下，如果加了目录，就有跨目录Include的问题（主要是lua.h，lauxlib.h）。从实际表现来看，include .c或.cpp时，用到的.h文件如果是在同目录就没问题，如果跨目录了就会找不到。 我用PlayerSettings.WebGL.emscriptenArgs = "-Imy_file_folder_path"；这样设置搜索路径，但是没用；然后定义宏-Dxx也没用，不知道为什么。（参数中没有自己定义的路径和宏，都是Unity自己的，虽然ProjectSettings.asset已经生效了。） 请问有解决方案吗？ A：可以试试： PlayerSettings.SetAdditionalIl2CppArgs("--compiler-flags=-Imy_file_folder_path"); 感谢littlesome@UWA问答社区提供了回答，欢迎大家转至社区交流分享： https://answer.uwa4d.com/question/660d2b385c7f5d2c5805d38e Crash Q：最近被Android的一个崩溃搞得毫无头绪。烦请各位大佬帮忙指导分析一下。 这里是从Bugly截取的最后一段崩溃日志，Unity线程运行良好。然后一个不知名线程突然就报了一个java.lang.NoSuchMethodError的崩溃，更奇怪的找不到函数名name='Thread-37' ，来源文件也是Unknown Source。 19404-18 15:18:27.898 21248 21470 I Unity : CreateScene sceneInst complete 2 19504-18 15:18:27.911 21248 21470 I Unity : Lod level: 1 19604-18 15:18:28.264 21248 22705 W Unity : ! parseType; T is not known! 197--------- beginning of crash 19804-18 15:18:28.282 21248 22705 E AndroidRuntime: FATAL EXCEPTION: Thread-37 19904-18 15:18:28.282 21248 22705 E AndroidRuntime: Process: com.readygo.barrel.gp, PID: 21248 20004-18 15:18:28.282 21248 22705 E AndroidRuntime: java.lang.NoSuchMethodError: no non-static method with name='Thread-37' signature='Thread-37' in class Ljava.lang.Object; 20104-18 15:18:28.282 21248 22705 E AndroidRuntime: at com.unity3d.player.ReflectionHelper.getMethodID(Unknown Source:162) 这个大概会是什么问题呢？全网搜遍没有类似的问题。 同时，此问题在GooglePlay后台报的崩溃错误如下： 初始是怀疑第三方库导致，但是和公司同项目组比较过。使用同样的第三方库的项目并没有出现类似崩溃。 所以请问有没有类似的问题经验或者思路启发？非常感谢。 欢迎有经验的朋友转至社区交流： https://answer.uwa4d.com/question/6620f1b05ce8a46b00fc4ce5 Unreal Q：电影摄像机在两个节点之间有时会转一圈，比…

Unity升级后打包AssetBundle变慢
type: item
date: 2023-03-28T04:57:00+03:00
description: 1）Unity升级后打包AssetBundle变慢 ​2）打包使有些资源合成了一个资源data.unity3d，有些分开的原因 3）Unreal在移动设备中无法使用Stat命令获取到GPU Thread的耗时 4）Unity中如何看到相机视野范围内的剔除结果 这是第330篇UWA技术知识分享的推送，精选了UWA社区的热门话题，涵盖了UWA问答、社区帖子等技术知识点，助力大家更全面地掌握和学习。 UWA社区主页：community.uwa4d.com UWA QQ群：465082844 AssetBundle Q：最近升级到了2021，遇到个奇怪的问题。打AssetBundle包，前面的速度正常，打到场景的时候变的非常慢，每2个场景之间不知道为什么停了1分钟，几十个场景，加起来AssetBundle包不到20MB，打了1个半小时，如果我只打这些场景，速度就是正常的，完整打AssetBundle包到了场景这里就特别慢。 A：可以尝试用Scriptable Build Pipeline来打包，在输出目录可以看到json文件，用Perfetto可以打开这个文件看耗时信息。 https://docs.unity3d.com/Packages/com.unity.scriptablebuildpipeline@1.18/manual/BuildLogger.html 该问答由UWA提供，欢迎大家转至社区交流： https://answer.uwa4d.com/question/6420fec76778221ae3074852 Build Q：为什么打出来的包有些是资源合成了一个资源data.unity3d，有些是分开的？ A1：可以看看是不是以下这个设置导致的： 感谢范世青@UWA问答社区提供了回答 A2：比较建议使用LZ4的压缩方式的，AUP上传纹理必须使用LZ4的压缩方式，TextureStreaming也依赖LZ4的压缩。 感谢Xuan@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/641c1a1b6778221ae3044550 Unreal Q：我在移动设备Android上，输入Stat Unit命令，结果显示： Frame：42.33ms Game：24.22ms Draw：42.22ms RHIT：25.00ms Mem：1.96GB Draws：496 Prims：545.33KB 为什么没有GPU的耗时显示呢？可能是什么原因？ 针对以上问题，有经验的朋友欢迎转至社区交流分享： https://answer.uwa4d.com/question/641d1ca66778221ae304da66 Rendering Q：Unity中如何看到相机视野范围内的物体？类似Unreal Engine的FreezenRendering功能，方便快速的定位视锥体剔除。 针对以上问题，有经验的朋友欢迎转至社区交流分享： https://answer.uwa4d.com/question/63b41cd03bd6691a9ddc485c 封面图来源于网络 今天的分享就到这里。当然，生有涯而知无涯。在漫漫的开发周期中，您看到的这些问题也许都只是冰山一角，我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入，也许你的方法恰能解别人的燃眉之急；而他山之“石”，也能攻你之“玉”。 官网：www.uwa4d.com 官方技术博客：blog.uwa4d.com 官方问答社区：answer.uwa4d.com UWA学堂：edu.uwa4d.com 官方技术QQ群：465082844

GOT Online for Unreal 功能更新
type: item
date: 2020-11-30T05:16:00+02:00
description: GOT Online在去年就已经支持了Unreal引擎，它不仅灵活便捷，还提供了数据的深度分析，例如引擎各模块的耗时分布、资源的具体信息等高级分析功能。为进一步满足广大Unreal开发者的需求，近期我们增加了对Unreal 4.25版本的支持，同时支持“Lua性能分析”模式。目前该服务免费提供给Unreal开发者使用。 使用方法非常简单： 1）在UWA官网下载工具套件，参照文档说明集成SDK 2）在本地真机上进行测试 3）将测试所得数据一键上传到UWA官网 4）登录UWA官网在项目页面中查看对应的报告 目前GOT Online for Unreal提供三种模式：Overview（总体性能分析）、Assets（运行时资源检测）、Lua性能分析。关于之前已支持的Overview与Assets模式，详情可戳本链接。下文将对本次新增的Lua性能分析模式做介绍。当前仅4.25版本支持Lua模式，且仅支持SLua。后续我们会陆续支持其它Lua框架，同时也会陆续对4.20-4.24进行Lua模式的支持。 Lua性能检测目前分为三个部分：总体堆内存、CPU时间占用和堆内存具体分配。 1、总体堆内存 该页面记录了Lua的总内存走势以及Lua中几种重要对象的数量：Table、Function和Userdata。 2、CPU时间占用 在CPU时间占用页面，罗列了CPU累计耗时最高的10个入口函数。 点开这些函数，我们就可以查看这些函数的总体耗时堆栈、指定场景堆栈以及在任意一帧的具体耗时堆栈，帮助用户快速定位瓶颈函数。 3、堆内存具体分配 该页面便于研发团队定位Lua堆内存分配较多的函数，我们可以查看这些函数在任意一帧的具体分配堆栈，帮助研发团队优化Lua的堆内存分配，降低Lua GC的触发频率和触发时的开销。 切换查看方式，即通过“倒序调用分析”功能，我们就可以直观地定位到底哪一个Lua脚本中的哪一行代码在分配大量堆内存。这样，研发团队就能直接打开对应的Lua脚本，找到那一行和函数直接修改，优化变得如此简单。 注：Lua函数的命名格式为X@Y:Z，其中X是其函数名，在无法获取时，X会变为默认的unknown；Y是该函数定义的文件位置；Z则是该函数被定义的结束行号。需要注意的是，当Lua脚本以字节码运行时，该值将始终为0，因此建议在测试时尽可能使用Lua源码来运行，或者在编译字节码的时候加上-g参数以保留行号。 以上即为本次GOT Online for Unreal更新的功能。我们希望通过它能大幅度提升大家定位问题、发现问题的效率。该服务目前免费提供给开发者用，快跟着小编的脚本一起来撸羊毛！ 登录UWA网站，功能中选择GOT Online 点击立即体验 项目引擎选择Unreal 即可体验起啦~

URP关于多个摄相机的性能优化
type: item
date: 2020-10-26T08:38:00+02:00
description: 1）URP关于多个摄相机的性能优化 ​2）Unity Addressables打包的时候如何设置BuildAssetBundleOptions.DisableWriteTypeTree 3）Unreal可以用于商业化游戏的热更新方案 4）UGUI SpriteAtlas在使用中回调实例化，AtlasRequested和Start的顺序颠倒 5）从AssetBundle中动态加载渲染管线，后期渲染异常问题 这是第224篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题，建议阅读时间10分钟，认真读完必有收获。 UWA 问答社区：answer.uwa4d.com UWA QQ群2：793972859（原群已满员） Rendering Q1：URP7.4.3，除开主相机外，还有一个子相机，用于将照到的模型渲到游戏主界面UI上。在Profiler中看到以下情况： 可以看到，在子相机中也进行了包括对LOD的计算，但子相机的CullingMask只开了一个名为RTModel的Layer，在这一层里只有一个3D对象。按说子相机CullScriptable这块开销不应该有才对。 目前怀疑可能的原因是URP会对每个Base Camera都进行这部分的计算，但如果用Overlay相机，又无法用原来的方式将相机的targetTexture渲到一张RawImage上了。 有人遇到过么？ A：题主的疑惑是：子相机的CullScriptable这块的开销不应该有那么大对吧（毕竟我只有一个物件）？ 这里有两个问题： 1.Culling到底做了啥，只有一个物件为啥要Culling那么久（难道只有一个物件也要做很多的准备工作）？ 2.你在Profiler里面看到的数据真的是真实数据吗？也就是说，子相机的Culling真的做了1.68ms吗？ 抛开这两个问题，也可以有更好的做法： 我们一共两个相机，主相机和UI相机，那么UI上显示的3D物件怎么办呢？ 我们有个虚拟相机，所谓相机，其实就是做一个VP矩阵，做一个RT，绘制可见的物件就可以了。那么使用Unity的SRP，随便在什么地方，设置一下VP矩阵，设置RT，接着绘制指定的物件（UI中所有的3D物件都会挂在这个物件下面），然后这个RT就可以随意使用了。 假如一个UI上有两个3D物件，尽量都放在一个RT上，如果不行，就放在两个或更多的RT上。只是会多几个绘制命令，几个RT（还不需要是全屏的），而且会多几个Swap RT的操作。由于我们项目没需求需要若干RT，所以假设一下，在这种需要若干RT的情况下，也可以用一个RT加多个Viewport来解决的。这个代码都是现成的，参考一下Cascade Shadow Map的做法，这样Swap RT也就省了。 综上所述，既然你都知道自己要绘制什么，就不要给Unity Culling的机会了。 感谢王烁@UWA问答社区提供了回答 Q2：数据是在Development Build中连真机看到的性能数据， 目前在使用类似于HLOD的方式来减少掉这个LOD的巨大开销。楼上说的“设置一下VP矩阵，设置RT”，请问这个VP矩阵的操作具体是什么？可否详解下或者有相关资料吗？ A：一切皆有可能！但不过这个不重要。然后你提的HLOD和LOD和上面的Culling没关系。VP矩阵就是view矩阵和projection矩阵。相机的作用就是提供这俩矩阵的。 如果你在管线里面设置了相应的矩阵，然后绘制指定的物件，就可以完全不用多一个相机，毕竟多一个相机就多一个Culling。 如果你对VP矩阵不熟悉，不清楚怎么实现，也简单。依然用一个额外相机，关上这个相机的Culling，然后在渲染pass中，不要绘制cullingresult.visibleobject，而直接用Graphics.DrawMesh或者CommandBuffer.DrawMesh绘制你要显示的那个3D Object的物件就好了。 感谢王烁@UWA问答社区提供了回答，欢迎大家转至社区交流： https://answer.uwa4d.com/question/5f914de75d9aea5aa9719769 Addressable Q：原来的AssetBunlde打包的时候可以设置BuildAssetBundleOptions.DisableWriteTypeTree，使得包体小好多。今天项目尝试升级使用Addressables，请问该如何设置BuildAssetBundleOptions.DisableWriteTypeTree? A1：首先Addressable打Bundle包主要的脚本是BuildScriptPackedMode，在DoBuild函数内可以看到用了AddressableAssetsBundle…

Linear Rendering在移动设备上的支持率
type: item
date: 2018-11-08T05:39:00+02:00
description: 本期我们聚集了这些话题：Linear Rendering的支持率、通过蓝图/C++在运行时修改MeshData粒子系统的Mesh、PSS增长定位、优化Lua逻辑代码产生的内存... 这是第135篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题，建议阅读时间10分钟，认真读完必有收获。 UWA 问答社区：answer.uwa4d.com UWA QQ群：793972859（原群已满员） 渲染 Q1：在此篇博客里，有提到Linear Space Color这个特性在安卓机上的支持率是61%，在苹果机上是71%。 不过这个数据是2016年的数据，已经不适用于现在了，我们希望能知道Linear Rendering这个特性在现在安卓机和苹果机上的支持率，当然，如果能区分地区（例如大中华区和东南亚各自的支持率）和更加细节（例如OpenGL ES 2和OpenGL ES3占有率、Vulkan支持率、iOS Metal的支持率等）就更好了。 另外，如果我们在Gamma颜色空间下，使用PBR流程制作手机游戏想要有更好的表现效果，有什么好的策略和方法吗？现在我们使用的是Metal-Roughness贴图，Shader是参考下面这篇博客，修改Standard的Shader代码写成的。 占有率这个东西，不同的统计渠道可以得出不同的统计结果，我这里没有具体的数据，只能提供个人的建议——2019年上市的3D游戏，除非特别小型，在国内市场，我个人认为是不用去考虑OpenGL ES 2.0的设备了。三四年前的千元机已经支持OpenGL ES 3.0了（比如红米Note2、小米2A），何必为了这点市场份额而额外增加那么多限制呢？（Alpha通道拆分、自己在Shader中做线性空间处理、Shader要注意贴图采样数量限制等等） 另外大致看了下题主贴的文章，其实是在Gamma的设置下自己在Shader中实现Linear Space的计算过程而已，这种方式有两个小问题： 1）增加GPU额外计算量，比基于硬件的方式消耗更大一点点； 2）最终的从线性空间转换到伽马空间的过程，注意最理想的是在最后一步来进行，如果有多个Pass，这里的计算过程在效果上可能有错误（单个Pass，没有后处理的情况下看上去是一致的）。当一个Pass输出的颜色会作为下一个Pass的输入时，也要将颜色转换回线性空间来计算才正确。 还有就是不仅仅albedo贴图，所有是颜色的贴图/通道都需要做这样的计算才是正确的。 使用链接中的方式可以实现线性空间的效果，比较老的游戏也通常是这样做的，但是我个人会倾向于直接使用Unity内置好的功能，性能上和便利性上都会更好一些。 另外，个人观点，基于PBR流程的话，在做好基准效果之后，程序能做的事情不多，毕竟都是物理计算的，后面的效果大都依赖于美术对于PBR的理解以及制作经验了。 感谢贾伟昊@UWA问答社区提供了回答 最近项目刚切到线性空间去，查了些资料，Linear Rendering需要支持OpenGL ES 3.0 ，Android版本参考4.3, 以下是一份Android版本参考数据，参考版本数据大致可以推出占比 ： https://blog.csdn.net/qq_29428215/article/details/80847211 iOS参考iOS 7的iPhone 5s。 经过我查看的资料和调研，我跟楼上观点一致，直接切线性空间。 感谢赵林@UWA问答社区提供了回答 该问答来自UWA问答社区，欢迎大家转至社区交流： https://answer.uwa4d.com/question/5bd7df711ea0b505053cc4ee 逻辑代码 Q2：控制Lua逻辑代码产生的内存，如何回收才能避免内存峰值过大？ C#和Lua都可以在回收的时候被标记为null，从UWA报告中的曲线可以看出，C#的回收机制是一段时间自行回收，Lua却没有，可以理解在堆内存管理上是有区别的？如果避免这样的内存泄露问题，控制内存暴涨，有什么更好的回收方法？ 补充理解： 手动回收内存：Lua内存回收调用Collect，C#调用GC； 自动回收内存：C#申请的内存置空或Clear可以回收掉，而Lua描述中也是置空可以让其自动回收，但是下面的Lua变化曲线没有锯齿线的变化，这有点不明白了，是否我理解错了？ 自动回收的说法可能有点问题，Clear或者置空只能认为是解除对对象的引用，并没有回收对象的内存。 回收的时间点总是发生在GC时的，只是有些是手动调用的，有的是自动触发的。上面C#和Lua的曲线不同，应该只是GC触发的规则和时间点不同（C#的频率高，而且每次是全量的GC，一次性回收；Lua的规则会复杂些，而且还可能是分代的）。 然后也可能是C#层的堆内存分配…

UWA正式支持Unreal 引擎！
type: item
date: 2018-09-18T04:59:00+03:00
description: 随着游戏内容的日趋精品化和重度化，Unreal引擎逐渐走进国内开发商的视野并被使用，然而其高门槛的操作使用和项目本身的重度性也使得优化工作愈发复杂艰难。作为性能优化的服务商，UWA测评今天正式支持了Unreal 引擎开发的项目，帮助Unreal开发者高效定位并优化性能瓶颈，该服务目前免费提供给开发者使用。 在目前UWA性能测评报告中，不仅有宏观的总体性能概览和细致的引擎模块检测，对于一些重要性能函数，报告提供了详细的堆栈分配信息，结合报告中的实时屏幕截图，研发团队能更直观地针对性能瓶颈进行定位和修复，下面就跟随小编的脚步一睹庐山面目吧！ 总体性能走势概览、细分模块数据分析 在总体性能页面中，我们展示了测试项目在运行过程中的CPU耗时以及内存走势，研发人员能快速对项目的主要问题了然于胸。 总体性能趋势—CPU性能占用 而对于微观的细节问题定位，我们提供了各个引擎模块的重要耗时参数信息。如下图，在渲染模块中，我们提供了DrawCall、Triangle、半透明/不透明渲染、相机裁剪、可见性计算单元数量等耗时走势。 总体性能趋势—渲染模块性能 针对报告中每个引擎模块中的重要参数，我们以UWA Tips的形式进行了详细说明，用户可方便地从数据中找出游戏运行过程中不同模块各项指标的数据，如下图所示： 代码堆栈是定位性能瓶颈的鹰眼。在目前的性能报告中，我们支持了多线程耗时的详细查看：对于游戏逻辑具体耗时，研发团队可查看游戏线程的调用栈信息，对于渲染模块的具体耗时可查看渲染线程的调用栈信息。同时，我们将其他线程中耗时较高的Top 10函数列举在OtherThread中，方便用户查看。 点开上图中的某一函数，我们能查看该函数在运行过程中的具体代码堆栈信息，包括总耗时、自身耗时和调用次数等。通过总体堆栈和指定帧查看两个模式，结合项目的运行截图，可以对代码的运行效率了如指掌。 代码效率—代码堆栈 而对于内存和资源的使用，我们分别列出了CPU和GPU端的内存占用情况。 同时，报告中也列出了游戏运行中，不同类型资源的使用情况以及其所占用的内存。用户可以很方便地查看指定资源的内存占用走势，并对不规范的异常资源进行排查和优化。 具体资源信息 除了以上功能，UWA性能测评报告还提供硬件参数解析（PSS、温度、电量）、运行日志等数据检测，在此不多赘述，大家可参考这里的完整Unreal性能报告Demo，当然我们更欢迎大家来体验！ 如何使用UWA测评服务 用户注册登录UWA官网后，在项目标签下“新建项目”，填写项目名称并根据测试的平台下载对应的SDK。 根据提示集成SDK后编译生成测试包，在提交页面中提交，并提供对应的测试流程。提交后，即可坐等报告生成。 目前，UWA支持Unreal游戏/应用在iOS、Android和PC三大平台的性能测评，同时随着对Unreal引擎更深入的测试和研究，我们将探索更多性能参数的规律。在后续的研发中，我们会不断更新UWA的测评机制，力求为Unreal开发者提供更有针对性的分析和参考。

基于Unreal引擎的大地形加载研究
type: item
date: 2018-05-10T05:28:00+03:00
description: UWA从去年开始进入Unreal引擎的学习，并且从去年底开始发表了一系列关于Unreal引擎使用方面的技术文章。但是，今天的这篇文章与以往的功能介绍不太一样，我们想通过一个实际的案例来让你对Unreal引擎产生更加深入的了解。 由于吃鸡游戏的火爆以及精品MMO游戏对于场景的需求越来越大，所以，我们这两个月使用Unreal引擎对大地形的动态加载功能进行了研究。从中，我们希望可以搞清楚以下两点： Unreal引擎对于大场景动态加载的制作方法； Unreal引擎在当今移动设备上的性能表现。 为了让我们的地形展示看起来更加“漂亮”一点，我们放弃了自己手动制作大地形场景的想法（我们自己做的地形实在拿不出手），而是使用了之前在Unity引擎中使用过的大地形场景模型。除了最终的渲染效果，我们几乎是1:1地在Unreal引擎还原了该场景环境，其在真机上的运行效果如视频所示。 视频中左边是Unity引擎的渲染结果，右边是Unreal引擎的渲染结果。 本文将主要介绍我们通过Unreal引擎制作大地形的过程中遇到的问题，希望可以对正在或即将使用Unreal引擎开发大地形功能的研发团队有所帮助。本文主要包含三个部分： Unreal引擎的资源准备； Unreal引擎场景流式加载功能介绍； Unreal引擎在真机上的性能分析。 接下来，我们将分别介绍这四部分内容。 一、 Unreal引擎的资源准备 由于我们希望使用一个已有的案例资源来制作Unreal引擎的大地形加载，所以，我们首先需要解决的，就是如何将Unity引擎的资源转换到Unreal引擎中进行使用。在资源转换过程中，我们需要处理四种类型的资源：地形、模型、纹理和材质。接下来我们分别介绍这四种资源的转换方式。 1. 地形资源 在原始的大场景动态加载案例中，我们使用的是Unity引擎的Terrain系统。但由于Unity与Unreal引擎中地形的数据格式不一样，因此我们无法直接在Unreal引擎中使用Unity引擎的地形数据。因此，我们尝试通过地形的高度图来将Unity引擎Demo中的地形转换到Unreal引擎中，其转换方式如下图所示： 我们首先对Unity引擎中的地形块导出高度图，然后将高度图导入Unreal引擎重建出相同的地形。高度图中的每一个像素记录的实际是地形块中每一个顶点在垂直方向上的高度。Unreal引擎中对于高度图的导入非常便利，如下图所示。在Unreal引擎高度图导入界面，我们只需在New Landscape界面中选择Import from File，并选中我们想要导入的高度图，再点击Import按钮即可导入高度图并重建地形。 但是，由于Unity与Unreal引擎的坐标系的不同，从Unity引擎中导出的高度图直接放入Unreal引擎中会导致重建出的地形与原始Unity引擎中的地形相对X轴呈现镜像的关系，如下图所示： 上图中左图是Unity引擎坐标系和原始地形截图，右图是Unreal引擎坐标系和重建地形截图。对于这种情况，我们可以做一个简单的坐标变换来让其看起来一致。但是，我们发现在Unity引擎中导出高度图时勾选Flip Vertically选项，也可以达到同样的效果，如下图所示： 其中，左图是Unity引擎原始地形，右图是高度图Flip后在Unreal引擎中重建出的地形。 在制作Unreal引擎大地形Demo时，我们不仅希望地形的形状与Unity引擎Demo一致，并且希望地形参数设置也尽量与Unity保持一致。在Unreal引擎地形参数中，主要包含了三个参数： Component Section Quad 这三个参数从上至下是包含关系，即：一块地形中可包含多个Component，一个Component可以包含多个Section，一个Section可以包含多个Quad。而Quad则是地形网格中最小的四边形。接下来我们分别介绍这三个参数的设置。 1.1 Component 在Unreal引擎的地形中，Component实际上是裁剪、渲染以及碰撞检测的基本单元。Unreal引擎在渲染地形时，一个Component要么被整体裁剪掉，要么被整体渲染出来并参与碰撞检测的计算。而其数量则是通过New Landscape窗口中的Number of Components参数进行设置，如下图所示： 其中，左图显示了New Landscape窗口设置界面，红色方框显示了Number of Components参数。该参数的设置可以任意选择，例如：1x1，1xN或者NxN。而我们在设置该参数时主要是参考Unity引擎大地形Demo的设置。右图显示了Unity引擎中地形的截图。在Unity引擎中物体裁剪是以GameObject为单位，而我们在制作地形时是以一块子地形作为一个GameObject。因此，在Un…