在之前的一些文章中,介绍了UE热更新丢失Shader使用默认材质的处理问题,以及Shader Patch的方案。
详情可见文章:
其实运行时丢失材质的根本原因是新添加或修改的资源所依赖的Shader没有被打包,运行时读取失败导致的错误。本篇文章来介绍一下Shader更新的策略和优缺点,以及对引擎内机制的分析,并提供一个结合Shader Patch与Inline Shader Code优点的优化方案,已经在HotPacther中实现。
在之前的一些文章中,介绍了UE热更新丢失Shader使用默认材质的处理问题,以及Shader Patch的方案。
详情可见文章:
其实运行时丢失材质的根本原因是新添加或修改的资源所依赖的Shader没有被打包,运行时读取失败导致的错误。本篇文章来介绍一下Shader更新的策略和优缺点,以及对引擎内机制的分析,并提供一个结合Shader Patch与Inline Shader Code优点的优化方案,已经在HotPacther中实现。
先前介绍了一系列UE中热更新工程实践的文章,能够实现基于原始工程的资源的版本比对与差异更新。但默认情况下资源的更新是基于文件的更新,某个资源产生了变动,就要将该资源的文件完整地打包进去,而UE的资源变动在Cook之后并不会造成整个文件的全部更新,序列化时只变动了某些bytes。在这种情况下,基于文件的Patch机制能够大幅度减少补丁的大小,本篇文章对二进制补丁的生成和加载方案做一个概述,以HotPatcher为基础,可以方便地实现二进制补丁的生成。
为了实现这个需求,我将HDiffPatch移植到了UE内,将其作为HotPatcher默认的二进制差异补丁的DIFF/PATCH算法,基于Modular Feature方式也可以方便地扩展其他的算法。
UE4.27推出了一项新的机制,可以把UE编译成库,能够嵌入到外部程序中,由其他的程序来驱动引擎的执行与消息通信。但是目前官方还没有放出任何有价值的文档,我分析了引擎中的相关代码,提出一个UE as Lib的实践方案,理论上也能在4.27之前的引擎版本实现,或许会与后续官方发布的文档不一致,权当抛砖引玉。相关的研究内容也会在本篇文章中持续更新。
Unreal Insights是UE自4.23之后提供的一个Profiling工具,可以非常方便地看到游戏运行的各个线程的火焰图,但是官方文档只提供了PC和Android的连接方法,并不直接支持IOS,不太方便。研究了一下发现IOS主要是网络策略的问题,本篇文章提供一个UE与IOS设备的真机Profliing以及端口互通方案,可以支持实时的Profiling以及Cook on the fly等IOS真机与PC数据互通的需求。
在大世界项目以及疫情导致的远程办公需求,开发中的协同编辑显得格外重要。在UE的资源机制中,地图是单个的资源,虽然可以使用Sub-level的形式拆分,但是最小元素仍然是单个资源,当不同的Designer修改相同的资源时,就会造成文件冲突,也没办法像文本那样合并。并且每个人负责编辑单个子关卡也没有办法实时预览整个场景的效果,在协同开发中,这是一个瓶颈。
在UE4.23之后,UE官方推出了一个多人协作机制,可以使多人共同地编辑同一份地图,并不会造成冲突,并且可以同步其他变动的资源并能够实时生效,作为版本控制的补充,能够比较完美地解决同步协作的问题。
本篇文章记录一下启用流程、使用规范以及网络策略等问题,也会提取独立的Server端程序而无需依赖完整的引擎,实现Server端的方便部署。
之前我写了一篇文章,在UE中集成了ZSTD压缩算法:ModularFeature:为 UE4 集成 ZSTD 压缩算法,并且把UE5中的Oodle的压缩算法库提取出来,可以在UE4中使用:Oodle Compression。最近分析了一下他们的压缩、解压、CPU、内存的消耗,分别测试了WindowsNoEditor/Android_ASTC/IOS三个平台,以及Oodle的Kraken使用不同的压缩级别在不同平台的性能。
终于,在2021年的五月底,UE5终于要推出第一个预览版本了,虚幻引擎5——将于中国时间5月26日周三晚10点开启抢先体验计划!。
对UE5期待许久,去年Nanite和lumen一石激起千层浪,时隔一年,终于能够实际体验到了。
过去一年,关于UE5的技术消息不多,我做过了一些Epic披露的关于UE5相关的信息总结和分析,有兴趣的可以移步notes/ue5中查看。本篇文章会记录上手UE5的一些体验,相较于UE4开发方式的变动,为UE4到UE5的过渡,以及将UE5应用到生产环境做一个技术预研,近期会持续更新。
UE中具有PSO Cache机制,全称Pipeline State Object Caching,用于预先记录和构建出运行时所使用的材质依赖的Shader信息,当项目首次使用这些Shader时,该列表可以加速Shader的加载/编译过程。PSO Cache会把渲染状态、顶点声明、Primitive类型、RenderTarget像素格式等数据保存到文件中,提升Shader的加载效率。
本篇文章主要介绍PSO Cache的启用及构建流程,并会分析PSO Cache在引擎中的加载流程以及实现热更PSO方式、错误处理等,PSO Cache的原理有时间再进行详细分析。
在之前的一篇文章中,介绍了Mac/IOS的开发笔记和一些工程实践:UE4 开发笔记:Mac/iOS 篇。本篇文章作为姊妹篇,记录我在使用UE在开发Android时所用的标准化环境、调试工具、工程实践以及分析相关的引擎代码等内容,记录了一些在项目中遇到的坑,主要从我之前的笔记notes/ue中整理而来,后续Android相关的内容也都会更新到这篇文章里。
在开发游戏时,程序性能是需要着重考虑的问题,因为要尽可能覆盖最多的用户群体,就要考虑那些中低端设备的运行效果,兼容非常多配置差异的硬件,在这种情况下,怎么样分析和优化游戏的性能瓶颈是关键。
在运行时把更多的资源加载至内存中,本质上是一种空间换时间的思路。因为频繁从磁盘进行IO是非常耗时的,把资源预先加载到内存就可以实现高速读取,但是内存资源也是有限的,并不能不加限制地使用,尤其是对某些中低端移动设备而言,4G甚至更小的内存的设备目前还具有不少的占有率,所以在内存方面不能浪费,而且过高的内存占用也有可能导致被系统查杀。
内存优化本质上就是在加载效率和内存占用之间寻求一个平衡,怎么样在能满足兼容更多低配设备正常运行不触发OOM的同时尽可能地把可利用的内存使用起来,提高程序的运行效率。
准备写几篇性能优化相关的文章,本篇文章先从UE内存分析入手,介绍常用的内存分析工具和方法,以及对UE项目中能够进行的内存优化手段做一个整理,这部分内容之前以笔记的形式记录在notes/ue中,后续内存相关的内容都会补充到本篇文章。