终于,在2021年的五月底,UE5终于要推出第一个预览版本了,虚幻引擎5——将于中国时间5月26日周三晚10点开启抢先体验计划!
对UE5期待许久,去年Nanite和lumen一石激起千层浪,时隔一年,终于能够实际体验到了。
过去一年,关于UE5的技术消息不多,我做过了一些Epic披露的关于UE5相关的信息总结和分析,有兴趣的可以移步notes/ue5中查看。本篇文章会记录上手UE5的一些体验,相较于UE4开发方式的变动,为UE4到UE5的过渡,以及将UE5应用到生产环境做一个技术预研,近期会持续更新。

阅读全文 »

UE中具有PSO Caching机制,全称Pipeline State Object Caching,用于预先记录和构建出运行时所使用的材质依赖的Shader信息,当项目首次使用这些Shader时,该列表可以加速Shader的加载/编译过程。PSO Caching会把渲染状态、顶点声明、Primitive类型、RenderTarget像素格式等数据保存到文件中,提升Shader的加载效率。
本篇文章主要介绍PSO Caching的启用及构建流程,并会分析PSO Cache在引擎中的加载流程以及实现热更PSO方式、错误处理等,PSO Caching的原理有时间再进行详细分析。

阅读全文 »

在之前的一篇文章中,介绍了Mac/IOS的开发笔记和一些工程实践:UE4 开发笔记:Mac/iOS 篇。本篇文章作为姊妹篇,记录我在使用UE在开发Android时所用的标准化环境、调试工具、工程实践以及分析相关的引擎代码等内容,记录了一些在项目中遇到的坑,主要从我之前的笔记notes/ue中整理而来,后续Android相关的内容也都会更新到这篇文章里。

阅读全文 »

在开发游戏时,程序性能是需要着重考虑的问题,因为要尽可能覆盖最多的用户群体,就要考虑那些中低端设备的运行效果,兼容非常多配置差异的硬件,在这种情况下,怎么样分析和优化游戏的性能瓶颈是关键。

在运行时把更多的资源加载至内存中,本质上是一种空间换时间的思路。因为频繁从磁盘进行IO是非常耗时的,把资源预先加载到内存就可以实现高速读取,但是内存资源也是有限的,并不能不加限制地使用,尤其是对某些中低端移动设备而言,4G甚至更小的内存的设备目前还具有不少的占有率,所以在内存方面不能浪费,而且过高的内存占用也有可能导致被系统查杀。

内存优化本质上就是在加载效率和内存占用之间寻求一个平衡,怎么样在能满足兼容更多低配设备正常运行不触发OOM的同时尽可能地把可利用的内存使用起来,提高程序的运行效率。

准备写几篇性能优化相关的文章,本篇文章先从UE内存分析入手,介绍常用的内存分析工具和方法,以及对UE项目中能够进行的内存优化手段做一个整理,这部分内容之前以笔记的形式记录在notes/ue中,后续内存相关的内容都会补充到本篇文章。

阅读全文 »

HotPatcher项目开源这一年多以来,经过了不少的更新和优化,也被越来越多的开发者选择作为自己项目的热更新方案,期间有不少人陆陆续续询问UE4热更新相关遇到的问题,很多问题比较常见,重复询问的频率也比较多,所以我准备把一些常见的问题进行整理,方便初步上手UE4热更新方案的人能够尽快地排查问题。

本篇文章会持续更新UE4热更新和HotPatcher相关的Q&A内容,有疑问的地方也可以直接在本篇文章中评论,我会定期统一回答和整理,也可以加入我的UE4热更新群讨论遇到的问题(QQ群958363331)。

阅读全文 »

之前的热更新系列文章中介绍了UE热更新的流程和打包细节,其实有一些热更补丁优化的工程实践我觉得也可以详细介绍。

本篇文章从生成Shader的Patch入手,目的减少每次热更新时的Shader的大小,并会对引擎内部的实现细节做一些分析,解决引擎中的Shader Patch的相关问题,并基于HotPatcher的实现自动化的Shade Patch流程。

阅读全文 »

之前写了两篇UE中实现反射的文章分析,介绍了UE的反射基础概念和依赖的一些C++特性,本篇文章开始分析UE反射实现的具体流程。

C++标准中并没有反射的特性,UE使用的反射是基于标记语法UHT扫描生成辅助代码来实现的一套机制,正如David Wheeler的那句名言一样:“All problems in computer science can be solved by another level of indirection”,UHT做的就是这样的事情,在真正执行编译之前分析标记代码并产生真正的C++代码,收集反射类型的元数据,供运行时之用。

UHT生成的代码内容很多,为了避免文章组织上的混乱,本篇文章主要讲GENERATED_BODY/UFUNCTION等反射标记通过UHT之后生成到generated.h中的真正的C++代码

UHT生成的代码分别在generated.hgen.cpp中,generated.h中的代码大多是定义了一些宏,用在所声明的类内通过编译器预处理来添加通用成员,gen.cpp中的代码则是UHT基于反射标记生成的用来描述类反射信息的具体代码,genrated.hgen.cpp也是为了声明和定义分离。

阅读全文 »

在前面的文章中,介绍了基础包的拆分规则和实现,在基础的打包规则稳定之后,日常开发中的关注重点就转向侧重于项目的资产管理和包体资源审计、分析项目中的资产大小和冗余情况等。

本篇文章介绍UE中的资源打包配置、常用的资产管理方式以及资产审计工具等工程实践,热更新系列文章的资源管理篇,也是对上一篇文章UE4热更新:拆分基础包的内容补充。

阅读全文 »

在之前的几篇文章中,分别介绍了UE热更新的实现机制,以及热更的自动化流程,近期打算继续写几篇文章介绍下UE里热更新中资源包管理的流程和规则。

当然,不同类型的项目会有不同的打包策略,资源管理也没有通用的最佳策略。本篇文章主要介绍热更新流程中基础包的拆分的工程实践,涉及修改引擎实现Android/IOS通用拆分方式的方法,希望对不同业务的项目能提供一些有用的思路。

阅读全文 »

HotPatcher是我之前开源的一个UE4热更新版本管理和资源打包工具,可以方便地进行版本间的差异分析和pak打包。之前的文章为了直观地介绍都是基于手动地在编辑器中进行配置和打包的,在真正的工程实践中,可以自动化的重复操作就要避免手动的参与,较早之前我就在插件中添加了commandlet的支持,近期修复了一些问题以及增加了很多针对commandlet的优化,本篇文章是基于HotPatcher的自动化热更新流程的工程实践。

阅读全文 »