How to build your own knowledge system?

学习如逆水行舟,不进则退。这一点在CS领域尤甚,新技术、新框架日新月异地发展,业务层面的技术迭代非常快,可能刚熟悉了一项技术,很快就又被淘汰了。所以只有不停地接触、了解和学习新的知识和技能才能不断地拓展自己的程序生涯。
本篇文章是我写博客几年的对平时技术积累进行的一些思考,本来当作notes改版的记录,现在觉得抽离出来当作单独的文章也比较合适,我很少写感悟类的东西,觉得方法论太虚,但是如果具有理论指导行动的自制力,方法论也是很有必要的,希望自己也能做到。

阅读全文 »

UE integrated WWise: concept and code analysis

WWise是Audiokinetic的跨平台音频引擎,可以与游戏引擎很好地进行交互,负责音频的同事可以只在WWise中处理音频,把游戏业务和音频的制作与管理分离,提供事件和参数给游戏引擎使用,实现与业务的解耦和对音频更精确的控制。
本篇文章主要介绍WWise与UE4的集成、远程构建、资源分析、文档收录,WWise与UE的控制交互以及Bank生成的代码分析。

阅读全文 »

UE import atlas: TexturePacker

在开发游戏时,会使用到大量的图片资源,使用图集的作用在于减少 DrawCall,提高性能。在UE中没有图集的打包工具,比较流行的方案是使用第三方的图集打包工具TexturePacker。新版本的TexturePacker支持直接导出UE4的Sprite,并且可以在引擎中直接导入。在之前的版本中可以使用VaTexAtlas通过Json Array的数据导入,不过与TexturePacker直接导出UE的Sprite相比,VaTexAtlas并没有优势,UE的Sprite还可以直接预览,VaTexAtlas则不可以,在官方已经支持的情况下不建议再使用VaTexAtlas作为UE导入图集的方式。

本篇文章主要内容是记录TexturePacker图集生成文件的分析、导入UE、选项介绍、以及记录在UE中使用遇到的问题。

阅读全文 »

UE Development Notes: Mac/iOS

本篇文章的主要内容是介绍UE在Mac上的开发环境部署、配置iOS远程出包、UPL在iOS上的应用(介入ipa出包过程)、工具和开发技巧、以及分析相关的引擎代码等内容,记录了一些在项目中遇到的坑,主要从我之前的笔记中整理而来,后续Mac和iOS相关的内容也都会更新到这篇文章里。

阅读全文 »

UE hot update: demand analysis and solution design

游戏热更新是在玩家不重新安装游戏的前提下获取最新游戏内容的方式,在PC和移动端的网络游戏中有很多应用,因为游戏上上线后要快速调整、修复bug、更新内容等等。如果每修改一点点内容都需要玩家去AppStore更新应用,甚至去网站手动下载再安装,而且不同的平台对于游戏的审核规则和反馈时间也不一致,运营也会疯掉。

在其他引擎中的热更应该有比较成熟的方案,但是在UE里还没看到有比较全面的文章来讲UE4的热更实现的文章,恰好之前分析和实现了UE4热更的内容,准备写两篇文章来记录一下思路和实现方案,并会实现一个可以运行的Demo,希望能对有需要的朋友一点帮助。

为了方便地统一收集和管理热更新和HotPatcher常见的问题与解决方案,我新建了一篇文章来记录和整理:UE4热更新:Questions & Answers,遇到问题可以先去看这个FAQ页面。

阅读全文 »

Integrate ZSTD compression algorithm for UE4 using ModularFeature

UE在打包时默认使用Zlib作为资源的压缩算法,但是从压缩率和解压速度来看它并不是最好的选择,可以从Squash Compression Benchmark去看各种压缩算的效率对比,我选择了facebook开源的ZStandard作为替换Zlib的压缩实现,因为ZSTD在保证压缩比的同时还具有不错的解压效率。
本篇文章并不只是讲怎么在UE里集成一个压缩算法,还会简单介绍一下UE里的一些功能的模块化组织方式——ModularFeature,使用这种方式可以比较方便地替换某些功能的实现,本文中的替换压缩算法是一个实践。

我在UE中集成ZSTD的方式是写了一个插件,源码集成,开源在Github上:hxhb/ue-zstd,支持Android和Windows、IOS以及MacOS,欢迎Star。

阅读全文 »

UE hot update: Lua programming guide based on UnLua

UE使用的是C++这种编译型语言,在编译之后就成了二进制,只有通过玩家重新安装才能打到更新游戏的目的。但是对于游戏业务而言,对于需求调整和bug修复时间要求非常迫切,频繁地让玩家更新App是不能接受的,游戏项目一般使用Lua作为游戏业务的脚本语言,是为了把运行时不可变的C++代码变成运行时可更新的Lua代码。

UE官方没有提供Lua的支持,但是腾讯开源了UnLua,在我当前的项目使用了,这两天我梳理了一下UnLua的资料(主要是官方文档、issus、宣讲PPT),加上自己测试UnLua写了一个小Demo的感悟,形成了本篇UE结合UnLua的编程指南,主要是总结使用UnLua来写业务的一些基本方法和坑,方便查看,本篇文章会持续更新。

另外,Lua文件打包成Pak可以用我之前开源的工具:hxhb/HotPatcher,而且我基于UnLua自己修改了一个版本,添加了一些额外的优化,源码集成了Luasocket/Luapanda/lpeg/Sproto/Luacrypt库,可以直接使用LuaPanda调试,Github地址为:hxhb/debugable-unlua.

阅读全文 »

The Differences and Relationships between UEC++ and Standard C++

新冠病毒(COVID-19)影响,整个春节都禁足在家,目前还没有复工,只能看看书整理一下笔记,希望疫情尽快过去,希望朋友们都身体健康。
本篇文章的主要内容是分析一下在使用UE开发时使用的C++和**标准C++**在语法上有哪些区别,UEC++本质是C++的一个超集,它支持和使用C++的全部特性,但是它在标准特性之上自己构建了一套语法。很多开发中的编译问题只有知道了两者的边界,才能够快速和准确地定位问题出现在哪个阶段。对于使用UE之前就学习过C++的来说这不是什么问题,但是对于先接触UE然后慢慢学C++的同学来说,这是个挺大的问题。

标准C++**是基于ISO/IEC 14882**的语言规范(C++98/03/11/14/17等标准),UEC++则是我们开发当中使用的Epic在标准C++之上扩展的用法,这里不讨论GC、反射之类的基于C++之上自己构建的对象体系,也不涉及UE中的各种库,关注的着重点在于核心语法层面。

阅读全文 »

Modify the default data storage path for Android games

默认情况下,使用UE打包出游戏的Apk并在手机上安装之后,启动游戏会在/storage/emulated/0/UE4Game/下创建游戏的数据目录(也就是内部存储器的根目录下)。按照Google的规则,每个APP的数据文件最好都是放在自己的私有目录,所以我想要把UE打包出来的游戏的数据全放到/storage/emulated/0/Android/data/PACKAGE_NAME目录中(不管是log、ini、还是crash信息)。
一个看似简单的需求,有几种不同的方法,涉及到了UE4的路径管理/JNI/Android Manifest以及对UBT的代码的分析。

阅读全文 »

HotPatcher: A open source UE resource hot patching tool

重要通知:作者没有任何平台和渠道录制收费课程,也不对任何第三方的商业行为背书。请擦亮双眼,谨防上当受骗。
本软件的开源协议:允许在商业项目中免费使用功能,但不允许任何第三方基于该插件进行任何形式的二次收费,包括但不限于录制收费课程、对插件及代码的二次分发等。

HotPatcher是一个用于管理热更版本和资源打包工具,用于追踪工程版本的原始资源变动来打出Patch。支持一键Cook多平台,一键打包多平台Patch,编辑器支持Windows和MacOS,再写一套从服务器下载patch的流程就是一套完整的游戏热更方案。HotPatcher已经在非常多的UE项目中使用,并会持续更新支持新的引擎版本,欢迎提issus。

HotPatcher与UnrealFrontEnd中的Patch机制不同,UE的Patch管理工程时存在一些问题:基于原始的的工程版本,很难在不同的电脑上打出完全相同的Patch,也无法基于Patch的版本再打出一个Patch,并且Patch包含的内容不能够直观预览。并且不能方便地能够把外部文件打包到pak中(如lua文件、db等non-assets,往往不在Content目录下),也无法方便地管理工程和Patch版本。

这个插件就是为了解决这样的问题,以项目原始资源作为版本依据,只需管理工程本身而无需关注UE生成的其他文件。并且可以方便地进行Cook/生成Pak/提取基础包中的资源信息/版本间diff/Patch拆分等操作。具有非常丰富的配置化选项与Commandlet支持,可以非常方便地实现自动化热更新出包流程。

目前支持的引擎版本为UE4.21-UE5,并对IoStore机制提供了支持!有很多朋友私信来问插件相关的问题,我创建了个群来讨论UE热更新和HotPatcher插件的问题(QQ群958363331),欢迎加入交流UE相关的技术。

为了方便地统一收集和管理热更新和HotPatcher常见的问题与解决方案,我新建了一篇文章来记录和整理:UE4热更新:Questions & Answers,遇到问题可以先去看这个FAQ页面。关于比较多人反馈插件内配置参数与之前的录制视频不一致的问题,是因为插件进行了很多更新迭代,每个版本的详细变动,可看更新日志

阅读全文 »