UWA问答 | 博客 | 游戏及VR应用性能优化记录分享 | 侑虎科技 - Unreal
type: channel
link: https://blog.uwa4d.com/tag/Unreal
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引擎的大地形加载研究
items: 虚幻引擎学习之路：新粒子系统Niagara
items: 虚幻引擎学习之路：粒子系统篇（一）

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…

虚幻引擎学习之路：新粒子系统Niagara
type: item
date: 2018-02-09T03:49:00+02:00
description: 在前期关于Unreal 4 引擎的技术推文中，UWA重点介绍了粒子系统的重点模块和高级功能。本文将进行介绍Unreal 4引擎中的新粒子系统：Niagara。需要说明的是，目前的Niagara粒子系统仍处于测试阶段，并非最终完成版。 这是UWA发布的第10篇Unreal 4技术文章，之前我们已经详细介绍过渲染系统、动画系统以及部分粒子系统的功能介绍，详情请转至UWA博客（blog.uwa4d.com）。同时，特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核，并在UWA团队学习其引擎的道路上提供的大力支持。 一、Niagara使用 1.1 开启功能 在最新的Unreal 4引擎中，Niagara模块已经被加入到引擎的插件中。需要使用时，只需通过菜单Edit->Plugin打开Plugin窗口，搜索”Niagara”并选择Enabled即可，如下图所示： 然后，在Content Browser中点击鼠标右键会出现新的菜单选项FX，该子菜单中包含了Niagara的各种资源选项，如下图所示： 其中，上图红色框中显示了Niagara中包含的各种资源：Niagara System为粒子系统资源，Niagara Emitter为发射器资源，Niagara Script为粒子系统逻辑脚本资源，Niagara Parameter Collection为参数集合资源。接下来，本文将分别对其进行介绍。 1.2 Niagara System Niagara System资源类似于Cascade中的Particle System资源。其创建方式可以通过右键菜单”FX->Niagara System”创建，将其拖入场景中时，引擎会自动创建Niagara Actor，并在其Niagara Component中引用该Niagara System资源： 其中，上图红色框显示了Niagara System资源，红色箭头表示将其拖入场景，蓝色框表示引擎生成的Niagara Actor，绿色框表示在其Niagara Component中引用拖入的Niagara System资源。 双击Niagara System资源可打开编辑器，如下图所示： 其中，上图红色框显示了Niagara System包含两个Niagara Emitter，在其区域内通过右键菜单可添加更多Niagara Emitter。Niagara System与Cascade的Particle System类似，可以包含多个Niagara Emitter，其执行顺序是从上至下。上图中绿色框显示了Niagara System的脚本节点图，其中包含两部分：Spawn和Update。Spawn只在该Niagara System初始化时执行一次，Update则会在每一帧都执行。从Niagara System的节点图中可知，其执行过程是顺序执行其包含的所有Niagara Emitter的Spawn和Update节点。 1.3 Niagara Emitter Niagara Emitter类似于Cascade中的Emitter。只是在Cascade中，Emitter的创建和编辑都在Particle System资源中，而在Niagara中它成为一个独立的资源。通过右键菜单”FX->Niagara Emitter”可创建该资源，双击该资源可打开其编辑器，如下图所示： 在目前最新的4.18.3版本中，新创建的Niagara Emitter会出现一系列报错信息。上图红色框显示了错误信息。同时打开Selected Emitter Graph窗口会发现Emitter的节点图默认情况下为空。此时可先点击上图中的一系列Fix Error按钮，引擎会自动添加相应的Module，并生成相应的节点图。添加完成后如果发现还有错误提示，可先关闭Emitter编辑器界面，重新打开，错误提示便会消失，如下图所示： 其中，上图中Emitter的Module设置界面中显示了6种不同类型的Module。设计者在这6种类型中添加不同的Module可以实现不同的粒子效果，其操作方式与Cascade中的Emitter添加Module非常相似。但与Cascade最大的不同点在于，Niagara中的这些Module除了可以使用引擎内置的之外，还可以使用设计者通过节点图编辑的自定义Module。而用户自定义节点图即为Niagara Script，本文将在后续内容中进行说明。 Niagara Emitter中不同块的Module执行时机也不相同： Emitter Spawn 表示Emitter Spawn时执行的Module，并且只执行一次 Emitter Update 表示Emitter Update时执行的Module，每帧都执行 P…

虚幻引擎学习之路：粒子系统篇（一）
type: item
date: 2018-01-11T05:15:00+02:00
description: 之前UWA已经完整介绍了Unreal 4引擎中渲染模块和动画模块，现在我们将介绍粒子系统的相关功能。本文将分两部分介绍Unreal 4引擎的粒子系统，其中包括：粒子系统的创建、类型和特殊功能。通过本系列文章，UWA希望读者能学习到以下知识点： Unreal 4引擎中粒子系统如何使用 Unreal 4引擎中粒子系统所能达到的视觉效果 Unreal 4引擎中粒子系统的LOD、向量场等功能使用 Unreal 4.18新推出的Niagara粒子系统功能使用 在此，特别感谢Unreal中国团队对于本篇文章中Unreal引擎相关内容的审核，并在UWA团队学习其引擎的道路上提供的大力支持。 基础功能 本节将介绍Unreal 4引擎中粒子系统的基础功能，主要分为两个部分，其中包括：粒子系统的结构和使用以及不同类型模块的介绍。 1.1 粒子系统结构和使用 Unreal 4引擎的粒子系统一共包含了4个层次结构：Emitter Actor、Particle System（资源）、Emitter以及Module。 Emitter Actor是场景中摆放的粒子系统对象。它默认具有粒子系统组件，在该组件中的Template参数中可以引用创建好的Particle System资源进行渲染，如下图所示： 其中，上图黄色框显示了场景中的Emitter Actor对象以及其组件，红色框显示了其粒子系统组件Template参数中引用的Particle System资源，绿色框显示了已创建好的Particle System资源。编辑场景时，只需将Particle System资源拖入场景，引擎便会自动创建对应的Emitter Actor对象。 Emitter和Module分别是Particle System资源中包含的两种结构。其中，一个Particle System资源可以包含多个Emitter，一个Emitter中可以包含多个不同的Module。它们与Unity引擎中的ParticleSystem和Module的结构和概念相似。下图显示了Unreal4和Unity引擎中粒子系统编辑器的截图： Unreal 4引擎中的粒子系统编辑器截图 Unity引擎中的粒子系统编辑器截图 在Unreal 4引擎中的粒子系统编辑器截图中，红色框显示了粒子系统资源中一个Emitter，绿色框显示了Emitter中的一个Module。下图显示了Unity引擎中粒子系统编辑器截图，红色框显示了粒子系统中的一个Particle System，绿色框显示了Particle System中的一个Module。在Unreal 4引擎粒子系统中有一个比较特殊的Module—Required。这个Module是每个Emitter默认包含并且无法关闭的，它类似于Unity引擎粒子系统中自带的参数设置，如上图中黄色框显示的部分。 Unreal 4引擎粒子系统中的Module计算顺序是从上至下，Module对于最终效果的影响也是在已执行的Module基础上进行累加。因此，在编辑Emitter时可以将重要的Module放在优先级更靠前的位置。Module前后顺序可以在Emitter界面通过鼠标拖拽进行调整。对于Module中参数的修改，Unity引擎是直接在Module的下拉列表中进行设置，Unreal 4引擎则是选中需要修改的Module，在编辑器的Details面板中进行设置，如下图所示： 其中，左图红框显示了Unity引擎粒子系统中Module参数的设置界面，右图红框显示了Unreal 4引擎粒子系统中Module参数的设置界面。 Unity与Unreal 4引擎粒子系统结构并不完全相同。其不同点在于，在Unity引擎中只有粒子系统组件，而没有粒子系统资源。因此，在Unity引擎中创建粒子系统需要先创建Game Object并添加粒子系统组件后才可将其保存成Prefab资源。 1.2 Module Unreal 4引擎粒子系统支持多种不同类型的Module。在编辑粒子系统的发射器时可以任意添加和删除Module，从而开启和关闭Module中的功能。不同的Module组合和参数设置能够实现丰富的粒子特效，例如：修改粒子的数量、速度、旋转、颜色以及生命周期等。在接下来的内容中，本节将介绍几种比较特殊的Module。 1.2.1 Type Data Type DataModule实现了不同类型的粒子系统。其类型主要包括： Sprite GPU Sprite Mesh Beam Ribbon AnimTrail 在创建粒子系统时，默认情况下使用的是Sprite类型。该类型为CPU计算模拟粒子运动，并使用Billboard面片渲染的粒子。下图显示了该种类型粒子实现的烟雾效果： 上图中的左图显示了该粒子系统渲染…